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

(* Global Options *)
Shuffle="false";Numbering="abc";
(* Numbers of select options and questions *)
SELNUM=13;Single="false";NUM=200;Title="被約階段行列からパラメータ表示(3x5)";
GeneralFeedback=StringJoin[{
"パラメータの数\\(k\\)は変数の自由度と言え，変数の数\\(-\\)独立な方程式の数となります.","また, 解\\({\\mathbf x}={\\mathbf a}+\\sum_{i=1}^k p_i{\\mathbf u}_i\\)において","\\(A{\\mathbf a}={\\mathbf b}\\), \\(A{\\mathbf u}_i={\\mathbf 0}\\)が成り立ちます."}];

IfDeb[a_,b_]:=If[DebugMode,a,b];DebOn[]:=DebugMode=True;DebOff[]:=DebugMode=False;
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"];
MFT[m_]:=MatrixForm[Transpose[m]];
MF[m_]:=MatrixForm[m];
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]];

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

(* select pairs of matrices *)
MAlist=Range[-6,6];
QtList={}; For[ct=1,ct≤NUM*1.3,ct++,
row=3;col=5; vn=col-1;
M0=Transpose[{Table[0,row]}];
pv=RandomChoice[{{1},{2},{1,2},{1,3},{1,4},{2,3},{2,4},{1,2,3},{1,2,4}}];
rk=Length[pv];kn=vn-rk;
CnL={1,1,Min[3,RandomChoice[Range[kn]]]};
InL={5,3,5}-CnL;
CMRE=RandomEchelonPV2[row,vn,pv,{-3,-2,-1,0,1,2,3,4}];
While[(Mb=Transpose[{Table[If[i>rk,0,RandomInteger[6]-3],{i,1,row}]}])==M0];
EMRE=ColCat[{CMRE,Mb}];
QtList=Append[QtList,{{CnL,InL},{row,col,rk,pv,CMRE,Mb,EMRE}}]];
(* QtList=DeleteDuplicates[QtList]; *)
QtList=RandomSample[QtList,NUM];Length[QtList]

Clear[QtextF];QtextF[mm_]:=Module[{CnL,row,col,rk,pv,CMRE,Mb,EMRE,vn,ret},
{CnL,{row,col,rk,pv,CMRE,Mb,EMRE}}=QtList[[mm]];vn=col-1;
ret=IfDeb[EMRE,
StringJoin[{
"\\({\\mathbf x}=(x_i)_{1\\leq i\\leq "<>TOT[vn]<>"}\\)",
"に関する<u>非斉次</u>連立1次方程式 \\(A{\\mathbf x}={\\mathbf b}\\)",
"の拡大係数行列\\((A|{\\mathbf b})\\)を行に関する基本変形により被約階段行列に",
"変形したところ\\("<>TOT[EMRE]<>"\\)となった. この方程式の解のパラメータ表示を",
"\\({\\mathbf x}={\\mathbf a}+p_1{\\mathbf u}_1+\\cdots+p_k{\\mathbf u}_k,",
"p_1,\\dots,p_k\\in {\\mathbb R}\\)として表すとき,\\(k\\)の値として正しいものを選べ. \n",
"また, ベクトル\\({\\mathbf a}\\)および\\({\\mathbf u}_i\\)として使えるベクトルとして適切なものを選べ. ",
"ただし, \\({\\mathbf u}_i\\)で選択したベクトルを用いてパラメータ表示を完全に記述できる必要はなく, ",
"また記述できるとも限らない."}]];
Return[ret]];

AListF[mm_]:=Module[{CnL,InL,Erct=1,row,col,rk,pv,kn,CMRE,Mb,M0,EMRE,vn,NB,Va,Va1,Vu,Vu1,IC,fsL={},fs1,fs2,fsN,ct,Wu,Wa,Wb,W0,retK={},retAC={},retAI={},retUC={},retUI={}},
{{CnL,InL},{row,col,rk,pv,CMRE,Mb,EMRE}}=QtList[[mm]];
fs1="正解です.";fs2="不正解です.";
vn=col-1;kn=vn-rk;NB=NullSpace[CMRE];M0=Transpose[{Table[0,row]}];
Wa="{\\mathbf a}";Wb="{\\mathbf b}";Wu="{\\mathbf u}";W0="{\\mathbf 0}";
fsL=Append[fsL,"パラメータの数:"<>fs1]; (* 1 *)
fsL=Append[fsL,"パラメータの数:"<>fs2]; (* 2 *)
fsL=Append[fsL,"特殊解\\("<>Wa<>"\\):"<>fs1]; (* 3 *)
fsL=Append[fsL,"特殊解\\("<>Wa<>"\\):"<>fs2<>" \\(A"<>Wa<>"="<>Wb<>"\\)を確認!"]; (* 4 *)
fsL=Append[fsL,"\\("<>Wa<>"\\)は係数行列や被約階段行列の行ではありません."]; (* 5 *)
fsL=Append[fsL,"パラメータの係数ベクトル\\("<>Wu<>"_i\\):"<>fs1]; (* 6 *)
fsL=Append[fsL,"パラメータの係数ベクトル\\("<>Wu<>"_i\\):"<>fs2<>" 方程式の解の差なので, \\(A"<>Wu<>"_i=\\)?"]; (* 7 *)
fsL=Append[fsL,"\\("<>Wu<>"_i\\)は係数行列や被約階段行列の行ではありません."]; (* 8 *)
(* k *)
(* IfDeb[Print["k"],Null];*)
For[ct=1,ct≤5,ct++,
If[ct==kn,IC="C";fsN=1,IC="I";fsN=2]; 
retK=Append[retK,{IC,IfDeb[ct,"\\(k="<>TOT[ct]<>"\\)"],fsL[[fsN]]}]];
(* a *)
(* IfDeb[Print["a"],Null];*)
 Va=Table[0,vn];For[ct=1,ct≤rk,ct++,Va[[pv[[ct]]]]=Mb[[ct,1]]];
If[CMRE.Transpose[{Va}]≠Mb,Print["ErrOr"<>TOT[Erct++]]];
(* Correct a *)
(* IfDeb[Print["a-C"],Null];*)
retAC=Append[retAC,{"C",IfDeb[MFT[{Va}],"\\({\\mathbf a}="<>TOTT[{Va}]<>"\\)"],fsL[[3]]}];
If[CnL[[2]]==2,Va1=Va+NB[[RandomChoice[Range[kn]]]];
If[CMRE.Transpose[{Va1}]≠Mb,Print["ERror"<>TOT[Erct++]]];
retAC=Append[retAC,{"C",IfDeb[MFT[{Va1}],"\\({\\mathbf a}="<>TOTT[{Va1}]<>"\\)"],fsL[[3]]}]];
(* Incorrect a *)
(* IfDeb[Print["a-I"],Null]; *)
While[Length[retAI]≤InL[[2]],
Vu=NB[[RandomChoice[Range[kn]]]];If[CMRE.Transpose[{Vu}]==Mb,Print["error"<>TOT[Erct++]]];
retAI=Append[retAI,{"I",IfDeb[MFT[{Vu}],"\\({\\mathbf a}="<>TOTT[{Vu}]<>"\\)"],fsL[[4]]}];
Vu=Table[Rnz[0],kn].NB;If[CMRE.Transpose[{Vu}]==Mb,Print["ErRoR"<>TOT[Erct++]]];
retAI=Append[retAI,{"I",IfDeb[MFT[{Vu}],"\\({\\mathbf a}="<>TOTT[{Vu}]<>"\\)"],fsL[[4]]}];
Va1=Va+Table[Rnz[0],vn];
If[CMRE.Va1≠Mb,
retAI=Append[retAI,{"I",IfDeb[MFT[{Va1}],"\\({\\mathbf a}="<>TOTT[{Va1}]<>"\\)"],fsL[[4]]}]];
If[RandomInteger[1]==0,
Va1=CMRE[[1]],Va1=EMRE[[1]]];
If[Length[Va1]==vn&&CMRE.Transpose[{Va1}]==Mb,Va1=EMRE[[1]]];
retAI=Append[retAI,{"I",IfDeb[MFT[{Va1}],"\\("<>Wa<>"="<>TOTT[{Va1}]<>"\\)"],fsL[[5]]}];
retAI=DeleteDuplicates[retAI]];
retAI=RandomSample[retAI,InL[[2]]];
(* Correct u *)
(*  IfDeb[Print["u-C"],Null]; *)
For[ct=1,ct≤kn,ct++,Vu=NB[[ct]];If[CMRE.Transpose[{Vu}]≠M0,Print["ErroR"<>TOT[Erct++]]];
retUC=Append[retUC,{"C",IfDeb[MFT[{Vu}],"\\("<>Wu<>"_i:"<>TOTT[{Vu}]<>"\\)"],fsL[[6]]}]];
While[Length[retUC]<=CnL[[3]],
Vu=Table[Rnz[1],kn].NB;If[CMRE.Transpose[{Vu}]≠Transpose[{M0}],Print["ERRor"<>TOT[Erct++]]];
retUC=Append[retUC,{"C",IfDeb[MFT[{Vu}],"\\({\\mathbf u}_i:"<>TOTT[{Vu}]<>"\\)"],fsL[[6]]}];
retUC=DeleteDuplicates[retUC]];
retUC=RandomSample[retUC,CnL[[3]]];
(* Incorrect u *)
(* IfDeb[Print["u-I"],Null]; *)
While[Length[retUI]<=InL[[3]],If[CMRE.Transpose[{Va}]==M0,Print["Error!!"<>TOT[Erct++]]];
retUI=Append[retUI,{"I",IfDeb[MFT[{Va}],"\\("<>Wu<>"_i:"<>TOTT[{Va}]<>"\\)"],fsL[[7]]}];
Va1=Va+Table[Rnz[0],kn].NB;If[CMRE.Transpose[{Va1}]==M0,Print["Error!"<>TOT[Erct++]]];
retUI=Append[retUI,{"I",IfDeb[MFT[{Va1}],"\\("<>Wu<>"_i:"<>TOTT[{Va1}]<>"\\)"],fsL[[7]]}];
Vu1=CMRE[[RandomChoice[Range[rk]]]];If[CMRE.Transpose[{Vu1}]==M0,Print["ErrOR"<>TOT[Erct++]]];
retUI=Append[retUI,{"I",IfDeb[MFT[{Vu1}],"\\("<>Wu<>"_i:"<>TOTT[{Vu1}]<>"\\)"],fsL[[8]]}];
retUI=DeleteDuplicates[retUI]];
retUI=RandomSample[retUI,InL[[3]]];
Return[Join[{{Plus@@CnL,Plus@@InL}},retK,RandomSample[Join[retAC,retAI],CnL[[2]]+InL[[2]]],RandomSample[Join[retUC,retUI],CnL[[3]]+InL[[3]]]]]];

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

DebOff[];GenMCxmlV2[DFname[2],Category<>Title<>"(MC2)",Title,NUM,Single,QtextF,AListF]

For[ct=1,ct≤100,ct++,Print[ct];AListF[ct]]

QtList[[1]]

AListF[1]

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

col=5

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

StringJoin[RandomSample[{"hoge","foo","bar",ToString[3]},4]]

DebOff[]

AListF[5]