(* 11_08 *)

(* Require XMLgen_MC.nb ver >=0.04 *)
SetDirectory[NotebookDirectory[]];
<<XMLgenMC.mx;
TTS[mt_]:=ToString[TeXForm[StandardForm[mt]]];
TOT[mt_]:=ToString[OneLineTeXForm[mt]];
TOTT[mt_]:=ToString[OneLineTeXForm[Transpose[mt]]];
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]]}];
Col[A_,n_]:=Transpose[{A[[Range[Length[A]],n]]}];
ColCat[CL_]:=Join@@@(Transpose@CL);
RowCat[CL_]:=Join@@(CL);
PtString[M_]:=StringReplace[ToString[M],{"{"->"(","}"->")"}];
ai2tex[s_]:=StringReplace[TOT[s],Table["\\text{a"<>TOT[i]<>"}"->"{\\mathbf a}_"<>TOT[i],{i,1,5}]];
Title="行列の積の計算";
SELNUM=6;NUM=200;

(* select pairs of matrices *)
QtList={}; For[ct=1,ct≤300,ct++,
Cn=RandomChoice[{2,2,3,3,3,3,3,4,4,4}];
r1=RandomChoice[{2,2,3,3,3,4}];c1=RandomChoice[{2,3,3,4,4,4}];
r2=c1;c2=RandomChoice[{2,2,3,3,3,4,4,4}];
MA=Table[Table[Rnz[0],c1],r1];MB=Table[Table[Rnz[1],c2],r2];
(* GL=Table[Table[Rnz[1],r1],r1]; *)
(* While[Abs[Det[GL]]≠1,GL=Table[Table[Rnz[1],r1],r1]];*)
GL=GetPnijc[r1,1,2,Rnz[1]].GetPnijc[r1,r1,1,Rnz[1]];
GR=Table[Table[Rnz[0],c2],c2];
While[Abs[Det[GR]]≠1,GR=Table[Table[Rnz[1],c2],c2]];
QtList=Append[QtList,{Cn,MA,MB,GL,GR}]];
QtList=DeleteDuplicates[QtList];
QtList=RandomSample[QtList,NUM];Length[QtList]

(* This question is canceled *)

Clear[QtextF]

QtextF[mm_]:=Module[{Cn,MA,MB,GL,GR,MC},
{Cn,MA,MB,GL,GR}=QtList[[mm]];MC=MA.MB;Return["次のうち, 積が定義され, かつ, \\("<>TOT[MC]<>"\\)となるものをすべて選べ."]];

For[ct=1,ct≤200,ct++,ICListF[ct]]

CListF[mm_]:=Module[{,Cn,MA,MB,GL,GR,MC,MG,MD,fs,ret={}},
{Cn,MA,MB,GL,GR}=QtList[[mm]];fs="正解です.";MC=MA.MB;
ret=Append[ret,{"\\("<>TOT[MA]<>TOT[MB]<>"\\)",fs}];
MD=Inverse[GL].MC;
ret=Append[ret,{"\\("<>TOT[GL]<>TOT[MD]<>"\\)",fs}];
MD=MC.Inverse[GR];
ret=Append[ret,{"\\("<>TOT[MD]<>TOT[GR]<>"\\)",fs}];
MG=GetPnijc[Length[MC],1,2,Rnz[2]].GetQnic[Length[MC],2,Rnz[1]];
MD=Inverse[MG].MC;
ret=Append[ret,{"\\("<>TOT[MG]<>TOT[MD]<>"\\)",fs}];
Return[RandomSample[ret,Cn]]];

ICListF[mm_]:=Module[{Cn,MA,MB,GL,GR,MC,MA1,MB1,MG,MD,r1,c1,r2,c2,fs1,fs2,fs3,ret={}},
{Cn,MA,MB,GL,GR}=QtList[[mm]];
r1=Length[MA];c1=Length[Transpose[MA]];
r2=Length[MB];c2=Length[Transpose[MB]];
If[r2≠c1,Print["Error"]];
MC=MA.MB;
fs1="積が定義されません.";
fs2="積は定義されますが, 与えられた行列と型が一致しません.";
fs3="積は定義され型も一致しますが, 成分に一致しないものがあります.";
MA1=ColCat[{MA,Transpose[{Table[Rnz[1],r1]}]}];
ret=Append[ret,{"\\("<>TOT[MA1]<>TOT[MB]<>"\\)",fs1}];
MB1=RowCat[{MB,{Table[Rnz[1],c2]}}];
ret=Append[ret,{"\\("<>TOT[MA]<>TOT[MB1]<>"\\)",fs1}];
MA1=RowCat[{MA,{Table[Rnz[1],c1]}}];
ret=Append[ret,{"\\("<>TOT[MA1]<>TOT[MB]<>"\\)",fs2}];
MB1=ColCat[{MB,Transpose[{Table[Rnz[1],r2]}]}];
ret=Append[ret,{"\\("<>TOT[MA]<>TOT[MB1]<>"\\)",fs2}];
MA1=MA;MA1[[1]]=MA[[1]]+Table[Rnz[1],c1];
If[MC≠MA1.MB,
ret=Append[ret,{"\\("<>TOT[MA1]<>TOT[MB]<>"\\)",fs3}]];
MB1=MB;MB1[[1]]=MB[[1]]+Table[Rnz[1],c2];
If[MC≠MA.MB1,
ret=Append[ret,{"\\("<>TOT[MA]<>TOT[MB1]<>"\\)",fs3}]];
MD=Inverse[GL].MC;MD[[1]]=MD[[1]]+Table[Rnz[1],c2];
If[MC≠GL.MD,
ret=Append[ret,{"\\("<>TOT[GL]<>TOT[MD]<>"\\)",fs3}]];
Return[RandomSample[ret,SELNUM-Cn]]];

GenerateMCxml[DFname[],"LA/11-08."<>Title<>"(MC1)",Title,NUM,"false",QtextF,CListF,ICListF]

ICListF[45]

{1,2,3} /. 2->Nothing

Nr=3;Nc=4;

Table[Table[Rnz[3],Nc+Rpos[1]],Nr]

sz=3;ToExpression[Table["a"<>TOT[j],{j,1,sz}]]

ColCat[{{{1,2},{2,3}},{{5},{7}}}]

RowCat[{{{1,2,3},{3,3,5}},{{4,4,4}}}]

RowCat[CL_]:=Join@@(CL);