(* 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=14;Single="false";NUM=300;Title="被約階段行列からパラメータ表示(一般)";

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]];

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++,
rk=RandomChoice[{3,3,3,3,4,4}];
col=RandomChoice[{7,7,7,7,8,8,8,9}]; (* Vn+1 *)
row=rk+RandomInteger[1];
vn=col-1;
kn=vn-rk; (* (6,7,8) - (3,4) = (3,4,5,6) *)
CnL={1,RandomChoice[{1,1,1,2}],RandomChoice[{3,3,3,4,4,5}]};
pv=Sort[RandomSample[Range[vn],rk]];
CMRE=RandomEchelonPV2[row,vn,pv,{-3,-2,-1,0,1,2,3,4}];
Mb=Table[If[i>rk,0,RandomInteger[6]-3],{i,1,row}];
EMRE=ColCat[{CMRE,Transpose[{Mb}]}];
QtList=Append[QtList,{CnL,{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="\\({\\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]];

CListF[mm_]:=Module[{CnL,row,col,rk,pv,kn,CMRE,Mb,EMRE,vn,NB,Va,Va1,Vb,fs,fs1,ct,retL={{},{},{}}},
{CnL,{row,col,rk,pv,CMRE,Mb,EMRE}}=QtList[[mm]];fs1="正解です.";vn=col-1;
NB=NullSpace[CMRE];Va=Table[0,vn];kn=vn-rk;
(* k *)
fs=fs1<>"解の「自由度」は変数の数から方程式の数だけ少なくなります.";
retL[[1]]=Append[retL[[1]],{"\\(k="<>TOT[kn]<>"\\)",fs}];
(* a *)
fs=fs1<>"\\(A{\\mathbf a}={\\mathbf b}\\)が成り立ちます.";
For[ct=1,ct≤rk,ct++,Va[[pv[[ct]]]]=Mb[[ct]]];
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{Va}]<>"\\)",fs}];
While[Length[retL[[2]]]<CnL[[2]],
Va1=Va+NB[[RandomChoice[Range[kn]]]];
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{Va1}]<>"\\)",fs}];
retL[[2]]=DeleteDuplicates[retL[[2]]]];
(* ui sample *)
fs=fs1<>"\\(A({\\mathbf a}+{\\mathbf u}_i)={\\mathbf b}\\)より\\(A{\\mathbf u}_i={\\mathbf 0}\\)となります.";
For[ct=1,ct≤kn,ct++,Vb=NB[[ct]];
retL[[3]]=Append[retL[[3]],{"\\({\\mathbf u}_i:"<>TOTT[{Vb}]<>"\\)",fs}]];
While[Length[retL[[3]]]<CnL[[3]],
Vb=Table[Rnz[0],kn].NB;
retL[[3]]=Append[retL[[3]],{"\\({\\mathbf u}_i:"<>TOTT[{Vb}]<>"\\)",fs}];
retL[[3]]=DeleteDuplicates[retL[[3]]]];
Return[Join[retL[[1]],RandomSample[retL[[2]],CnL[[2]]],RandomSample[retL[[3]],CnL[[3]]]]]];

ICListF[mm_]:=Module[{CnL,ICnL,row,col,rk,pv,k,kn,CMRE,Mb,EMRE,vn,NB,Va,Va1,Vb,Vb1,fs,ct,retL={{},{},{}}},{CnL,{row,col,rk,pv,CMRE,Mb,EMRE}}=QtList[[mm]];
vn=col-1;fs="正解です.";NB=NullSpace[CMRE];kn=vn-rk;Va=Table[0,vn];
ICnL={0,0,0};ICnL[[1]]=4-CnL[[1]];ICnL[[2]]=4-CnL[[2]];ICnL[[3]]=SELNUM-8-CnL[[3]];
(* k list *)
fs="連立1次方程式が解を持つとき， 係数行列のランクは連立1次方程式の解の「自由度」をどれだけ下げるかを表すことを理解しよう.";
While[Length[retL[[1]]]<=ICnL[[1]],k=RandomChoice[Range[2,vn+1]];
If[k≠kn,retL[[1]]=Append[retL[[1]],{"\\(k="<>TOT[k]<>"\\)",fs}]];
retL[[1]]=DeleteDuplicates[retL[[1]]]];
(* a list *)
For[ct=1,ct≤rk,ct++,Va[[pv[[ct]]]]=Mb[[ct]]];
fs="\\({\\mathbf a}\\)の表す変数の値は方程式の左辺を\\(0\\)にしますがいいでしょうか?";
While[Length[retL[[2]]]<2,Vb=NB[[RandomChoice[Range[kn]]]];
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{Vb}]<>"\\)",fs}];
retL[[2]]=DeleteDuplicates[retL[[2]]]];
While[Length[retL[[2]]]<ICnL[[2]]-3,Vb=Table[Rnz[0],kn].NB;
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{Vb}]<>"\\)",fs}];
retL[[2]]=DeleteDuplicates[retL[[2]]]];
fs="\\({\\mathbf a}\\)の表す変数の値を方程式の左辺に代入して右辺になりますか?";
While[Length[retL[[2]]]<ICnL[[2]]-1,
Va1=Va+Table[Rnz[0],vn];If[CMRE.Va1≠Mb,
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{Va1}]<>"\\)",fs}]]];
fs="\\({\\mathbf a}\\)は係数行列や被約階段行列の行ではありません.";
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{CMRE[[1]]}]<>"\\)",fs}];
retL[[2]]=Append[retL[[2]],{"\\({\\mathbf a}="<>TOTT[{EMRE[[1]]}]<>"\\)",fs}];
retL[[2]]=DeleteDuplicates[retL[[2]]];
(* b list *)
fs="\\({\\mathbf b_i}\\)の表す変数の値は方程式の解ではなく,「解の差」を与えることに注意しよう.";
fs=fs<>"したがって, 左辺に代入するとどうなるか考えよう.";
While[Length[retL[[3]]]<ICnL[[3]]-2,Va1=Va+Table[Rnz[0],kn].NB;retL[[3]]=Append[retL[[3]],{"\\({\\mathbf u}_i:"<>TOTT[{Va1}]<>"\\)",fs}];
retL[[3]]=DeleteDuplicates[retL[[3]]]];
fs="\\({\\mathbf b}_i\\)は係数行列や被約階段行列の行ではありません. 元の方程式がどうなるか考えよう.";
retL[[3]]=Append[retL[[3]],{"\\({\\mathbf u}_i:"<>TOTT[{CMRE[[RandomChoice[Range[2,rk]]]]}]<>"\\)",fs}];
retL[[3]]=Append[retL[[3]],{"\\({\\mathbf u}_i:"<>TOTT[{EMRE[[RandomChoice[Range[2,rk]]]]}]<>"\\)",fs}];
(* No Noises *)
Return[Join[RandomSample[retL[[1]],ICnL[[1]]],RandomSample[retL[[2]],ICnL[[2]]],RandomSample[retL[[3]],ICnL[[3]]]]]];

(* 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}

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