(* 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=15;Single="false";NUM=300;Title="1次方程式のパラメータ表示(n変数)";

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]];
MFT[m_]:=MatrixForm[Transpose[m]];
MF[m_]:=MatrixForm[m];

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

(* select pairs of matrices *)
MAlist=Range[-6,6];
QtList={}; For[ct=1,ct≤300,ct++,
CnL={1,RandomChoice[{1,1,1,2,2}],RandomChoice[{2,2,3,3,3,4,4}]};
InL={5,3,7}-CnL;
vn=RandomChoice[{4,4,4,5,5,5,5,5,6,6}];
MA=RandomSample[MAlist,vn];
Mx0=Table[Rnz[0],vn];
g=GCDL[MA];MA=MA/g;Mb=MA.Mx0;
QtList=Append[QtList,{{CnL,InL},{vn,MA,Mx0,Mb}}]];
(* QtList=DeleteDuplicates[QtList]; *)
QtList=RandomSample[QtList,NUM];Length[QtList]

Clear[QtextF];QtextF[mm_]:=Module[{CnL,InL,vn,Vars,MA,Mx0,Mb,eqS,ret},
{{CnL,InL},{vn,MA,Mx0,Mb}}=QtList[[mm]];
Vars=ToExpression[Table["x"<>ToString[i],{i,1,vn}]];
eqS=ci2tex["x",TOT[Vars.MA],""];
ret="\\(x_1,x_2,\\dots,x_"<>TOT[vn]<>"\\)の1次方程式 \\("<>eqS<>"="<>TOT[Mb]<>"\\)\n"
<>"のパラメータ表示"
<>"\\({\\mathbf x}=\\begin{pmatrix}x_1\\\\x_2\\\\\\vdots\\\\x_{"<>TOT[vn]<>"}"
<>"\\end{pmatrix}={\\mathbf a}+p_1{\\mathbf u}_1+\\cdots+p_k{\\mathbf u}_k, "
<>"p_1,\\dots,p_k\\in{\\mathbb R}\\)\n"
<>"について,\\(k\\)の値として正しいものを選べ. \n"
<>"また, ベクトル\\({\\mathbf a}\\)および\\({\\mathbf u}_i\\)として使えるベクトルとして適切なものを選べ"
<>"ただし, \\({\\mathbf u}_i\\)で選択したベクトルを用いてパラメータ表示を完成できる必要はなく, "
<>"また完成できるとは限らない(ある1つのパラメータ表示に現れうるベクトルを選ぶこと).";
Return[ret]];

QtextF[9]

{1,2,3}.NullSpace[{{1,2,3,1}}]

NullSpace[{{1,2,3,1}}]

AListF[mm_]:=Module[{CnL,InL,IC,vn,Vars,MA,Mx0,Mb,Va,ct,NB,Tmp,TmpL,fsL={},fsN,retK={},retA={},retU={}},
{{CnL,InL},{vn,MA,Mx0,Mb}}=QtList[[mm]];fsL=Append[fsL,"パラメータの数は正解です."];
fsL=Append[fsL,"パラータの数と変数の数の間の関係を確認しよう."];
fsL=Append[fsL,"特殊解は正解です."];
fsL=Append[fsL,"\\({\\mathbf a\\)の値は方程式を満たす必要があります."];
fsL=Append[fsL,
"パラメータの係数ベクトル\\({\\mathbf u}_i\\)の成分は方程式の値を\\(0\\)にしますね."];
fsL=Append[fsL,
"\\({\\mathbf u}_i\\)の表す変数の値は方程式の解ではなく,「解の差」を与えることに注意しよう."];
fsL=Append[fsL,"計算ミスでしょうか?"];
NB=NullSpace[{MA}];
(* k choice *)
For[ct=2,ct≤CnL[[1]]+InL[[1]]+1,ct++,
If[ct==vn-1,IC="C";fsN=1,IC="I";fsN=2];
retK=Append[retK,{IC,"\\(k="<>TOT[ct]<>"\\)",fsL[[fsN]]}]];
(* a choice *)
retA=Append[retA,{"C",IfDeb[MFT[{Mx0}],"\\({\\mathbf a}="<>TOTT[{Mx0}]<>"\\)"],fsL[[3]]}];
If[CnL[[2]]==2,
Va=Mx0+Table[Rnz[0],vn-1].NB;
retA=Append[retA,{"C",IfDeb[MFT[{Va}],"\\({\\mathbf a}="<>TOTT[{Va}]<>"\\)"],fsL[[3]]}]];
TmpL={};While[Length[TmpL]<InL[[2]],
Tmp=Table[Rnz[0],vn-1].NB;If[MA.Tmp≠Mb,
TmpL=Append[TmpL,{"I",IfDeb[MFT[{Tmp}],"\\({\\mathbf a}="<>TOTT[{Tmp}]<>"\\)"],fsL[[4]]}]];
Tmp=Mx0+Table[Rnz[0],vn];If[MA.Tmp≠Mb,
TmpL=Append[TmpL,{"I",IfDeb[MFT[{Tmp}],"\\({\\mathbf a}="<>TOTT[{Tmp}]<>"\\)"],fsL[[7]]}]]];
TmpL=RandomSample[TmpL,InL[[2]]];
retA=RandomSample[Join[retA,TmpL],CnL[[2]]+InL[[2]]];
(* u choice *)
While[Length[retU]<CnL[[3]],
Tmp=NB[[RandomChoice[Range[vn-1]]]];retU=Append[retU,{"C",IfDeb[MFT[{Tmp}],"\\({\\mathbf u}_i:"<>TOTT[{Tmp}]<>"\\)"],fsL[[5]]}];
Tmp=Table[Rnz[1],vn-1].NB;retU=Append[retU,{"C",IfDeb[MFT[{Tmp}],"\\({\\mathbf u}_i:"<>TOTT[{Tmp}]<>"\\)"],fsL[[5]]}];
retU=DeleteDuplicates[retU]];retU=RandomSample[retU,CnL[[3]]];
TmpL={};While[Length[TmpL]<InL[[3]],
Tmp=Mx0+Table[Rnz[0],vn-1].NB;If[MA.Tmp≠0,
TmpL=Append[TmpL,{"I",IfDeb[MFT[{Tmp}],"\\({\\mathbf u}_i:"<>TOTT[{Tmp}]<>"\\)"],fsL[[6]]}]];
Tmp=Table[Rnz[0],vn-1].NB+Table[Rnz[0],vn];If[MA.Tmp≠0,
TmpL=Append[TmpL,{"I",IfDeb[MFT[{Tmp}],"\\({\\mathbf u}_i:"<>TOTT[{Tmp}]<>"\\)"],fsL[[7]]}]];
TmpL=DeleteDuplicates[TmpL]];
retU=RandomSample[Join[retU,RandomSample[TmpL,InL[[3]]]],CnL[[3]]+InL[[3]]];
(* Noises *)
Return[Join[{{Plus@@CnL,Plus@@InL}},retK,retA,retU]]];

Plus@@{2,3,4}

QtextF[3]

DebOn[];AListF[3]

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

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

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

col=5

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