(* Require XMLgen_MC.nb ver >=0.20 *)
SetDirectory[NotebookDirectory[]];
<<XMLgenMC.mx;
DebugMode=False;
ThisNo=StringReplace[StringSplit[ NotebookFileName[],"/"][[-1]],{"LA_"->"",".nb"->"","_"->"-"}];
Category="LA/"<>ThisNo<>".";ThisNo

(* Global Options *)
Shuffle="true";Numbering="abc";
(* Numbers of select options and questions *)
SELNUM=5;Single="false";NUM=300;Title="被約階段行列からパラメータ表示(rank2)";

TTS[mt_]:=ToString[TeXForm[StandardForm[mt]]];
TOT[mt_]:=ToString[OneLineTeXForm[mt]];
TOTT[mt_]:=ToString[OneLineTeXForm[Transpose[mt]]];
TTSt[eq_]:=ToString[TeXForm[StandardForm[eq]]];
TOC[mt_,c_]:=TOTT[{Transpose[mt][[c]]}];
TTD[r_]:=StringReplace[TT[r],"\\frac"->"\\dfrac"];
Rnz[m_]:=(RandomInteger[m]+1)*(2*RandomInteger[1]-1); (* \\pm 1,\pm2,...,\pm(m+1) *)
Rpos[m_]:=RandomInteger[m]+1; (* 1,2,...,m+1 *)
Rbtw[m_]:=RandomInteger[2m]-m;
TTC[A_,n_]:=TOTT[{(Transpose[A])[[n]]}];
PtString[M_]:=StringReplace[ToString[M],{"{"->"(","}"->")"}];
ai2tex[s_]:=StringReplace[TOT[s],Table["\\text{a"<>TOT[i]<>"}"->"{\\mathbf a}_"<>TOT[i],{i,1,8}]];
ci2tex[c_,s_]:=StringReplace[s,Table["\\text{"<>c<>TOT[i]<>"}"->"{\\mathbf "<>c<>"}_"<>TOT[i],{i,1,5}]];
ci2tex[c_,s_,tx_]:=StringReplace[s,Table["\\text{"<>c<>TOT[i]<>"}"->"{"<>tx<>c<>"}_"<>TOT[i],{i,1,8}]];
TOTci2tex[c_,s_]:=StringReplace[TOT[s],Table["\\text{"<>c<>TOT[i]<>"}"->"{\\mathbf "<>c<>"}_"<>TOT[i],{i,1,8}]];
TpStr[L_]:="\\("<>TOT[L[[1]]]<>"\\times"<>TOT[L[[2]]]<>"\\)";
TpTpse[L_]:=If[L=={},{},{L[[2]],L[[1]]}];
PType[A_,B_]:=If[A=={}||B=={},Return[{}],
If[A[[2]]===B[[1]],Return[{A[[1]],B[[2]]}],Return[{}]]];
PTypeL[L_]:=Module[{ct,len,tmp},len=Length[L];
Which[len==0,Return[{}],len==1,Return[L[[1]]],
len==2,Return[PType[L[[1]],L[[2]]]],
True,tmp=L[[1]];For[ct=2,ct≤len,ct++,tmp=PType[tmp,L[[ct]]]];Return[tmp]]];
GCDL[L_]:=Module[{ct,ret=0},For[ct=1,ct≤Length[L],ct++,ret=GCD[ret,L[[ct]]]];Return[ret]];
IfDeb[a_,b_]:=If[DebugMode,a,b];

RE=RandomEchelonPV2[3,5,{1,3},Range[-3,3]]

NullSpace[RE]

Clear[p,q,r,s,t,u,v,x,y,z]

(* select pairs of matrices *)
MAlist=Range[-6,6];
pvList={{3,{1,2},{1,3},{2,3}}};
pvList=Append[pvList,{4,{1,2},{1,3},{2,3},{2,4}}];
pvList=Append[pvList,{5,{1,2},{1,4},{2,3},{2,5}}];
QtList={}; For[ct=1,ct≤500,ct++,
Cn=RandomChoice[{1,1,1,2,2}];
pvL=RandomChoice[pvList];
col=pvL[[1]];pv=RandomChoice[Table[pvL[[i]],{i,2,Length[pvL]}]];
row=3+If[col==5,1,0];
RE=RandomEchelonPV2[row,col,pv,MAlist];
QtList=Append[QtList,{Cn,{row,col,RE,pv}}]];
(* QtList=DeleteDuplicates[QtList];*)
QtList=RandomSample[QtList,NUM];Length[QtList]

Clear[QtextF];QtextF[mm_]:=Module[{Cn,row,col,RE,pv,ret},
{Cn,{row,col,RE,pv}}=QtList[[mm]];
ret="\\({\\mathbf x}=(x_i)\\)に関する<u>斉次</u>連立1次方程式の係数行列を"
<>"行に関する基本変形により被約階段行列に変形すると\n"
<>"\\("<>TOT[RE]<>"\\)となった."
<>" この方程式のパラメータ表示として正しいものをすべて選べ";
Return[ret]];

Clear[p,q,r,s,t,u,v,x,y,z];

CListF[mm_]:=Module[{Cn,row,col,RE,pv,Vars,GM,Wx,pars,eqS,kn,ct,NB,NB1,fs,ret={}},
{Cn,{row,col,RE,pv}}=QtList[[mm]];fs="正解です.";
NB=NullSpace[RE];Wx="{\\mathbf x}=";kn=Length[NB];
pars={p,q,r,s,t};
eqS=Wx;For[ct=1,ct<=kn,ct++,
eqS=eqS<>TOT[pars[[ct]]]<>TOTT[{NB[[kn+1-ct]]}];If[ct<kn,eqS=eqS<>"+"]];
ret=Append[ret,{"\\("<>eqS<>"\\)",fs}];
While[Length[ret]<Cn,
GM=Table[Table[Rnz[0],kn],kn];
While[Det[GM]==0,GM=Table[Table[Rnz[1],kn],kn]];
NB1=GM.NB;eqS=Wx;For[ct=1,ct≤kn,ct++,
eqS=eqS<>TOT[pars[[ct]]]<>TOTT[{NB1[[ct]]}];If[ct<kn,eqS=eqS<>"+"]];
ret=Append[ret,{"\\("<>eqS<>"\\)",fs}];
ret=DeleteDuplicates[ret]];
Return[RandomSample[ret,Cn]]];

ICListF[mm_]:=Module[{Cn,row,col,Vars,RE,RE1,pv,GM,Wx,pars,eqS,kn,pm,pmL,i,ct,NB,NB1,fs,ret={}},
{Cn,{row,col,RE,pv}}=QtList[[mm]];NB=NullSpace[RE];
pars={p,q,r,s,t};Wx="{\\mathbf x}=";kn=Length[NB];
If[kn>1,
fs="パラメータの数を確認してみよう.";
pmL=Subsets[Range[kn],{kn-1}];
For[i=1,i≤Length[pmL],i++,pm=pmL[[i]];eqS=Wx;
For[ct=1,ct<=kn-1,ct++,
eqS=eqS<>TOT[pars[[ct]]]<>TOTT[{NB[[pm[[ct]]]]}];If[ct<kn-1,eqS=eqS<>"+"]];
ret=Append[ret,{"\\("<>eqS<>"\\)",fs}]]];
fs="方程式を満たすか確認しよう.";
For[i=2,i≤col,i++,
If[! MemberQ[pv,i],eqS=Wx;(* Print["pv="<>TOT[pv]<>",i="<>TOT[i]]; *)
RE1=RE.GetQnic[col,i,-1];NB1=NullSpace[RE1];
For[ct=1,ct<=kn,ct++,
eqS=eqS<>TOT[pars[[ct]]]<>TOTT[{NB1[[kn+1-ct]]}];If[ct<kn,eqS=eqS<>"+"]];
ret=Append[ret,{"\\("<>eqS<>"\\)",fs}]]];
fs="係数行列の意味を理解していないようです. 方程式に戻して考えてみよう.";
eqS=Wx;For[ct=1,ct≤2,ct++,
eqS=eqS<>TOT[pars[[ct]]]<>TOTT[{RE[[ct]]}];If[ct<2,eqS=eqS<>"+"]];
ret=Append[ret,{"\\("<>eqS<>"\\)",fs}];
(* Noises *)
While[Length[ret]<SELNUM-Cn,eqS=Wx;
NB=NullSpace[RE];For[ct=1,ct<=kn,ct++,
eqS=eqS<>TOT[pars[[ct]]]<>TOTT[{NB[[kn+1-ct]]+Table[Rnz[0],col]}];If[ct<kn,eqS=eqS<>"+"]];
ret=Append[ret,{"\\("<>eqS<>"\\)",fs}];
ret=DeleteDuplicates[ret]];
Return[RandomSample[ret,SELNUM-Cn]]];

!MemberQ[{2,3},2]

? MemberQ

For[Ct=1,Ct≤NUM,Ct++,QtextF[Ct];CListF[Ct];ICListF[Ct]]; (* Error Check *)

GenerateMCxml[DFname[],Category<>Title<>"(MC1)",Title,NUM,Single,QtextF,CListF,ICListF]

#->Nothing &/@ Permutations[{1,2,3},{2}]

col=5

{x,y,z}.{1,2,3}