(* 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="true";Numbering="abc";
(* Numbers of select options and questions *)
SELNUM=6;Single="true";NUM=500;Title="空間の1次変換による平面の像";

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,tmp},tmp=Flatten[L];
For[ct=1,ct≤Length[tmp],ct++,ret=GCD[ret,tmp[[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 *)
QtList={}; For[ct=1,ct≤NUM*1.05,ct++,
Cn=1;
Rk=RandomChoice[{0,0,1,1,1,2,2,2,2}];
While[(Peq=Table[RandomInteger[4]-2,3])=={0,0,0}];
g=GCDL[Peq];Peq=Peq/g;
While[(Rb=Peq.(Mx0=Table[Rnz[2],3]))==0];
NB=NullSpace[{Peq}];NB1={Rnz[2],Rnz[2]}.NB;
(* While[MatrixRank[(MA=Table[Table[Rnz[5],3],3]).Transpose[NB]]!=Rk]; *)
While[Det[GM=Table[Table[Rnz[1],3],3]]==0];
Which[Rk==2,MA=GM,
Rk==1,MA=ColCat[{Col[GM,1],Col[GM,2]}].NullSpace[{NB1}],
Rk==0,MA=Transpose[{{Rnz[1],Rnz[1],Rnz[1]}}].{Peq}];
QtList=Append[QtList,{Cn,Peq,Mx0,Rb,MA,Rk}]];
(* QtList=DeleteDuplicates[QtList]; *)
QtList=RandomSample[QtList,NUM];Length[QtList]

Clear[QtextF];QtextF[mm_]:=Module[{Cn,Peq,Mx0,Rb,MA,Rk,Eqxyz,NB,Tmp,ret},
{Cn,Peq,Mx0,Rb,MA,Rk}=QtList[[mm]];
Eqxyz={x,y,z}.Peq;Tmp=MA.Transpose[NullSpace[{Peq}]];
NB=NullSpace[Transpose[Tmp]];
ret=IfDeb[{MF[MA],TOT[Eqxyz]<>"="<>TOT[Rb]<>","<>TOT[Rk],MF[Tmp],MFT[NB]},
StringJoin[{"\\(3\\)次正方行列\\(A="<>TOT[MA]<>"\\) によって定まる空間(\\({\\mathbb R}^3\\))の",
"1次変換による平面\\(\\pi:"<>TTS[Eqxyz]<>"="<>TOT[Rb]<>"\\)の像を求めよ."}]];
Return[ret]];

AListF[mm_]:=Module[{Cn,Peq,Peq1,g,Peq2,Mx0,Mx1,Rb,Rb1,MA,Rk,NB1,V1,V2,XB1,Eqxyz,fsL,Tmp,retC={},retI={}},
{Cn,Peq,Mx0,Rb,MA,Rk}=QtList[[mm]];
NB1=NullSpace[{Peq}].Transpose[MA];XB1=NullSpace[NB1];
Mx1=Transpose[MA.Transpose[{Mx0}]][[1]];Peq1=XB1[[1]];Peq2=({Peq}.Transpose[MA])[[1]];
fsL={};fsL=Append[fsL,"正解です."]; (*1*)
g=GCDL[Peq1];Peq1=Peq1/g;g=GCDL[Peq2];Peq2=Peq2/g;
Which[Rk==2,Eqxyz={x,y,z}.Peq1;Rb1=Mx1.Peq1;
fsL=Append[fsL,"平面であることは確かですが, 方程式が違うようです."]; (* 2 *)
fsL=Append[fsL,"直線には写りません."];fsL=Append[fsL,"1点には写りません."];(* 3,4 *)
retC=Append[retC,{"C",IfDeb[{Eqxyz,Rb1},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Rb1]<>"\\)"],fsL[[1]]}];
If[Rb≠Rb1,retI=Append[retI,
{"I",IfDeb[{Eqxyz,Rb},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Rb]<>"\\)"],fsL[[2]]}]];
If[MatrixRank[{Peq1,Peq2}]>1,Eqxyz={x,y,z}.Peq2;Tmp=Mx1.Peq2;retI=Append[retI,
{"I",IfDeb[{Eqxyz,Tmp},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Tmp]<>"\\)"],fsL[[2]]}]];
Eqxyz={x,y,z}.Peq1;Tmp=Mx0.Peq1;
If[Tmp≠Rb1,retI=Append[retI,
{"I",IfDeb[{Eqxyz,Tmp},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Tmp]<>"\\)"],fsL[[2]]}]];
retI=DeleteDuplicates[retI];
If[Length[retI]>2,retI=RandomSample[retI,2]];
retI=Append[retI,{"I",IfDeb[{Mx1,MFT[{NB1[[1]]}]},
"\\("<>PtString[Mx1]<>"\\)を通って\\("<>TOTT[{NB1[[1]]}]<>"\\)に平行な直線"],fsL[[3]]}];
retI=Append[retI,{"I",IfDeb[{Mx0,MFT[{NB1[[2]]}]},
"\\("<>PtString[Mx0]<>"\\)を通って\\("<>TOTT[{NB1[[2]]}]<>"\\)に平行な直線"],fsL[[3]]}];
Tmp=Table[Rnz[2],3];
retI=Append[retI,{"I",IfDeb[{Mx0,MFT[{Tmp}]},
"\\("<>PtString[Mx0]<>"\\)を通って\\("<>TOTT[{Tmp}]<>"\\)に平行な直線"],fsL[[3]]}];
retI=Append[retI,{"I",IfDeb[{"1点",Mx1},"1点\\("<>PtString[Mx1]<>"\\)"],fsL[[4]]}];
If[Mx0≠Mx1,retI=Append[retI,{"I",IfDeb[{"1点",Mx0},"1点\\("<>PtString[Mx0]<>"\\)"],fsL[[4]]}]];
Tmp=Table[Rnz[2],3];
retI=Append[retI,{"I",IfDeb[{"1点",Tmp},"1点\\("<>PtString[Tmp]<>"\\)"],fsL[[4]]}];
retI=RandomSample[DeleteDuplicates[retI],SELNUM-1],
(* case Rank 1 *)
Rk==1,fsL=Append[fsL,"直線であることと方向はあっていますが, 通る点が違います."]; (* 2 *)
fsL=Append[fsL,"直線であることはあっていますが, 方向が違います."];(* 3 *)
fsL=Append[fsL,"平面には写りません."]; (* 4 *)
fsL=Append[fsL,"平面には写りません. 法線ベクトルの1次変換による像は法線ベクトルになりません."]; (* 5 *)
fsL=Append[fsL,"1点には写りません."]; (* 6 *)
V1=NB1[[1]];If[V1=={0,0,0},V1=NB1[[2]]];
g=GCDL[V1];V1=V1/g;
retC=Append[retC,
{"C",IfDeb[{Mx1,MFT[{V1}]},"\\("<>PtString[Mx1]<>"\\)を通って\\("<>TOTT[{V1}]<>"\\)に平行な直線"],fsL[[1]]}];
If[MatrixRank[{Mx1-Mx0,V1}]==2,retI=Append[retI,
{"I",IfDeb[{Mx0,MFT[{V1}]},"\\("<>PtString[Mx0]<>"\\)を通って\\("<>TOTT[{V1}]<>"\\)に平行な直線"],fsL[[2]]}]];
If[MatrixRank[{V1,Mx1}]==2,retI=Append[retI,
{"I",IfDeb[{Mx0,MFT[{Mx1}]},"\\("<>PtString[Mx0]<>"\\)を通って\\("<>TOTT[{Mx1}]<>"\\)に平行な直線"],fsL[[3]]}]];
Eqxyz={x,y,z}.V1;Tmp=Mx1.V1;
retI=Append[retI,{"I",IfDeb[{Eqxyz,Tmp},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Tmp]<>"\\)"],fsL[[4]]}];
Eqxyz={x,y,z}.Peq1;Tmp=Mx1.Peq1;
retI=Append[retI,{"I",IfDeb[{Eqxyz,Tmp},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Tmp]<>"\\)"],fsL[[4]]}];
V1=({Peq}.Transpose[MA])[[1]];g=GCDL[V1];V1=V1/g;
Eqxyz={x,y,z}.V1;Tmp=Mx1.V1;
retI=Append[retI,{"I",IfDeb[{Eqxyz,Tmp},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Tmp]<>"\\)"],fsL[[5]]}];
retI=Append[retI,{"I",IfDeb[Mx0,"1点\\("<>PtString[Mx0]<>"\\)"],fsL[[6]]}];
retI=Append[retI,{"I",IfDeb[Mx1,"1点\\("<>PtString[Mx1]<>"\\)"],fsL[[6]]}];
Tmp=Table[Rnz[2],3];
retI=Append[retI,{"I",IfDeb[Tmp,"1点\\("<>PtString[Tmp]<>"\\)"],fsL[[6]]}];
retI=RandomSample[DeleteDuplicates[retI],SELNUM-1],
(* Case Rank 0 *)
Rk==0,fsL=Append[fsL,"平面には写りません."]; (* 2 *)
fsL=Append[fsL,"直線には写りません."];
fsL=Append[fsL,"1点と言っても点が違います."]; (* 4 *)
fsL=Append[fsL,"1点と言っても原点に写るとは限りません."]; (* 5 *)
retC=Append[retC,{"C",IfDeb[Mx1,"1点\\("<>PtString[Mx1]<>"\\)"],fsL[[1]]}];
retI=Append[retI,{"I",IfDeb[Mx0,"1点\\("<>PtString[Mx0]<>"\\)"],fsL[[4]]}];
If[Mx1≠{0,0,0},Tmp={0,0,0};
retI=Append[retI,{"I",IfDeb[Tmp,"1点\\("<>PtString[Tmp]<>"\\)"],fsL[[5]]}]];
Eqxyz={x,y,z}.Peq2;
retI=Append[retI,{"I",
IfDeb[{Eqxyz,Mx1.Peq2},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Mx1.Peq2]<>"\\)"],fsL[[2]]}];
If[Mx0.Peq2≠Mx1.Peq2,retI=Append[retI,{"I",
IfDeb[{Eqxyz,Mx0.Peq2},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Mx0.Peq2]<>"\\)"],fsL[[2]]}]];
V1=Table[Rnz[2],3];Eqxyz={x,y,z}.V1;Tmp=Mx1.V1;
retI=Append[retI,{"I",
IfDeb[{Eqxyz,Tmp},"平面\\("<>TTS[Eqxyz]<>"="<>TOT[Tmp]<>"\\)"],fsL[[2]]}];
retI=Append[retI,{"I",
IfDeb[{Mx0,MFT[{Peq2}]},"\\("<>PtString[Mx0]<>"\\)を通って\\("<>TOTT[{Peq2}]<>"\\)に平行な直線"],fsL[[3]]}];
retI=Append[retI,{"I",
IfDeb[{Mx1,MFT[{Peq2}]},"\\("<>PtString[Mx1]<>"\\)を通って\\("<>TOTT[{Peq2}]<>"\\)に平行な直線"],fsL[[3]]}];
retI=Append[retI,{"I",
IfDeb[{Mx1,MFT[{V1}]},"\\("<>PtString[Mx1]<>"\\)を通って\\("<>TOTT[{V1}]<>"\\)に平行な直線"],fsL[[3]]}];
retI=RandomSample[DeleteDuplicates[retI],SELNUM-1]];
Return[Join[{{1,SELNUM-1}},retC,retI]]];

QtList[[Range[200],4]]

DebOn[];QtextF[3]

DebOn[];AListF[3]

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

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