: Maxima数学A自習教材開発
教材の概要
3 整数の性質 1)約数と倍数
 1.約数と倍数
 2.最大公約数・最小公倍数
 3.整数の割り算と商・余り
 301.研究・発展・補充問題

Maxima数学I自習教材試行報告用紙(Word)
Maxima数学I自習教材試行報告用紙(PDF)

: 教材の概要

活動時間 
 自宅での予習か授業初めの5分程度
活動概要
 1 タブレット等を用いてトライ
  1) 教科書の該当ページを開く
  2) このWebページを開く
  3) Maxima on lineのWebページを開く
  4) 該当コマンドをMaximaOnLineにコピペして、実行
 2 自分なりの感触、着想
  1) 自分なりに、実行結果を見て、気づいたり感じたりすることがないか、考えてみる。
  2) ワークシートに、考えてみたこと(意見・質問・感じたこと)を書く
  3) ワークシートを、事前に提出する場合は、課題提出フォームを使うこと。
 3 問題の雰囲気を2で感じてから、授業へ
  1) 班活動などで自分の考えを仲間に伝える
  2) 仲間の考えを受け止める
  3) 筋が通って、見通しのよい解法、数学的な論点をうまく処理した解法をまとめる


http://www.ac.cyberhome.ne.jp/~konoha/KNOPPIX/MaximaBook.pdf
参照テキスト
 数研出版新編数学A

: 第3章整数の性質
 第1節 約数と倍数
  1.約数と倍数

   A. 約数と倍数
◆コマンド番号101

●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例1 101 6の約数は"/*(◆修正部分1)*/$
KOUSATU:"6を割り切る数が約数で負の数も約数で、・・・"/*(◆修正部分1)*/;

KANSUU:"";

M1:6/*(◆修正部分2)*/;
SUJIMITI:"i:−6~6で6を割って、割り切れたら、iは6の約数"/*(◆修正部分2)*/;
lY:[];for i:-M1 thru M1 do(if i#0 and mod(M1,i)=0 then lY:append(lY,[i]))/*(◆修正部分2)*/;
KAITOU:[lY,"6の約数"]/*(◆修正部分2)*/;
KAKUNIN:"";
for i in lY do(print([M1,i,quotient(M1,i),mod(M1,i)]))/*(◆修正部分3)*/;

print(MONDAI)$
print(SUJIMITI)$
print([KAITOU])/**/$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例1 3の倍数は" /*(◆修正部分1)*/$
KOUSATU:"3で割り切られる数が3の倍数で、負の数も3の倍数で、・・・" /*(◆修正部分1)*/;
M1:3 /*(◆修正部分2)*/;
SUJIMITI:"i:-3*5~3*5を3で割って、割り切れたら、iは3の倍数" /*(◆修正部分2)*/;
lY:[];for i:-M1*5 thru M1*5 do(if I#0 and mod(i,M1)=0 then lY:append(lY,[i])) /*(◆修正部分2)*/;
KAITOU:[lY,"3の倍数"] /*(◆修正部分2)*/;
for i in lY do(print([M1,i,quotient(i,M1),mod(i,M1)])) /*(◆修正部分3)*/;


◆コマンド番号102
●約数と倍数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"練習1 102 12の約数は"/*(◆修正部分1)*/$
KOUSATU:"12を割り切る数が約数で負の数も約数で、・・・"/*(◆修正部分1)*/;

KANSUU:"";

M1:12/*(◆修正部分2)*/;
SUJIMITI:"i:−12~12で12を割って、割り切れたら、iは12の約数"/*(◆修正部分2)*/;
lY:[];for i:-M1 thru M1 do(if i#0 and mod(M1,i)=0 then lY:append(lY,[i]))/*(◆修正部分2)*/;
KAITOU:[lY,"12の約数"]/*(◆修正部分2)*/;
KAKUNIN:"";
for i in lY do(print([M1,i,quotient(M1,i),mod(M1,i)]))/*(◆修正部分3)*/;

print(MONDAI)$
print(SUJIMITI)$
print([KAITOU])/**/$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"練習1 102 6の正の倍数を小さいものから順に"/*(◆修正部分1)*/$
KOUSATU:"6で割り切られる数が6の倍数で、・・・" /*(◆修正部分1)*/;
M1:6 /*(◆修正部分2)*/;
SUJIMITI:"i:1~6*5を6で割って、割り切れたら、iは6の倍数" /*(◆修正部分2)*/;
lY:[];for i:1 thru M1*5 do(if mod(i,M1)=0 then lY:append(lY,[i])) /*(◆修正部分2)*/;
KAITOU:[lY,"6の倍数"] /*(◆修正部分2)*/;
for i in lY do(print([M1,i,quotient(i,M1),mod(i,M1)])) /*(◆修正部分3)*/;


◆コマンド番号103

●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"練習1 103 a,bを整数とし、ともに3の倍数なら、a+bは3の倍数か"/*(◆修正部分1)*/$
KOUSATU:"I,Jを整数と宣言して、a:3*I;b:3*J;により3の倍数とし、a+bが3で割り切れるか判断する。"/*(◆修正部分1)*/;

KANSUU:"";

declare(I,integer);declare(J,integer)/*整数宣言*/;
M:3;a:M*I;b:M*J;D:factor(a+b)/*a,bを3の倍数として設定し、a+bを因数分解表現*//*(◆修正部分2)*/;
tF:if mod(D,M)=0 then true else false/*整除判定*/;
KAITOU:[tF,"a+bは",M,"の倍数"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"a:( )*I;b:( )*J;により( )の倍数として、a+b=( )*(   )と因数分解できて、・・・"/*(◆修正部分3)*/$

KAKUNIN:"I,Jを適当な値にして確認"$
im:-50;iM:50;jm:-50;jM:50;tF:true;
for i:im thru iM do(
/**/for j:im thru jM do(
/**//**/Dij:subst([I=i,J=j],D),
/**//**/if mod(Dij,M)#0 then (tF:false,print([D,Dij,mod(Dij,M),i,j]))),
/**/print([D,i,j,Dij,mod(Dij,M)]));
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"練習1 103 a,bを整数とし、a,a+bともに5の倍数なら、bは5の倍数か"/*(◆修正部分1)*/$
KOUSATU:"I,Jを整数と宣言して、a:5*I;a+b=5*J;により5の倍数とし、bについて解いて、bが5で割り切れるか判断する。"/*(◆修正部分1)*/;
M:5;a:M*I;eb:a+b=M*J;sB:rhs(solve(eb,b)[1]);D:factor(sB)/*a,bを3の倍数として設定し、a+bを因数分解表現*//*(◆修正部分2)*/;
KAITOU:[tF,"bは",M,"の倍数"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"a:( )*I;a+b=( )*J;により( )の倍数として、bについて解いて、b=( )*(   )と因数分解できて、・・・"/*(◆修正部分3)*/$


   B. 倍数の判定法
◆コマンド番号104
●倍数の判定法
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例2 104 3桁の自然数Nについて、百の位がa、十の位がb、一の位がCのとき、a+b+cは3の倍数ならNが3の倍数"/*(◆修正部分1)*/$
KOUSATU:"Nをa,b,cで表現して、3で割り切れるか判断する。"/*(◆修正部分1)*/;

KANSUU:"";

declare(a,integer);declare(b,integer);declare(I,integer)/*整数宣言*/;
M:3;ec:a+b+c=M*I;C:rhs(solve(ec,c)[1])/*ecをcについて解いてCとおく*//*(◆修正部分2)*/;
N:a*100+b*10+c;Nc:subst(c=C,N);D:factor(Nc)/*Nを設定し、Nを因数分解表現*//*(◆修正部分2)*/;
tF:if mod(D,M)=0 then true else false/*Nの3での整除判定*//*(◆修正部分2)*/;
KAITOU:[tF,"Nは",M,"の倍数"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"a+b+c=( )*Iにより、これを( )の倍数として、cについて解いて、100*a+10*b+c=( )*(   )と因数分解できて、・・・"/*(◆修正部分3)*/$

KAKUNIN:"I,Jを適当な値にして確認"$
im:-50;iM:50;tF:true;
for i:im thru iM do(
/**/Di:subst(I=i,D),
/**/if mod(Di,M)#0 then (tF:false,print([D,Di,mod(Di,M),i])),
/**/print([D,i,Di,mod(Di,M)]));
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例2 104 3桁の自然数Nについて、百の位がa、十の位がb、一の位がCのとき、Nが3の倍数ならa+b+cは3の倍数"/*(◆修正部分1)*/$
KOUSATU:"Nを3の倍数として、a+b+cをNで表現して、3で割り切れるか判断する。"/*(◆修正部分1)*/;
M:3;N:M*I;eN:N=a*100+b*10+c;C:rhs(solve(eN,c)[1])/*eNをcについて解いてCとおく*//*(◆修正部分2)*/;
eabc:subst(c=C,a+b+c);D:factor(eabc)/*eabcを設定し、eabcを因数分解表現*//*(◆修正部分2)*/;
KAITOU:[tF,"a+b+cは",M,"の倍数"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"N:( )*Iにより、a*100+b*10+cを( )の倍数として、cについて解いて、a+b+c=( )*(   )と因数分解できて、・・・"/*(◆修正部分3)*/$


◆コマンド番号106

●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"練習3・4 106 4桁の自然数N:123Xが、5の倍数でも、3の倍数でもあるとき、Xは"/*(◆修正部分1)*/$
KOUSATU:"5の倍数なら、Xは0,5、3の倍数なら・・・"/*(◆修正部分1)*/;

KANSUU:"";

declare(I,integer);lX:[0,5]/*整数宣言,lX:Xの候補*//*(◆修正部分2)*/;
M1:3;M2:5;DN:1+2+3+X;lx:[];tF:[]/*DNを設定し*//*(◆修正部分2)*/;
for x in lX do(if mod(subst(X=x,DN),M1)=0 then lx:endcons(x,lx))/*lx:DNが3の倍数になるもの*//*(◆修正部分2)*/;
for x in lx do tF:endcons(1230+x,tF)/*求める数*//*(◆修正部分2)*/;
KAITOU:[tF,"求める数"]/*解答*/$
SUJIMITI:"5の倍数ならX=0,5、3の倍数なら、mod(1+2+3+X,3)=( )。この式により、X=0,5のいずれかを・・・"/*(◆修正部分3)*/$

KAKUNIN:"tFの成分が3,5で割り切れることを確認"/*(◆修正部分4)*/$
for x in [M1,M2] do( print(["mod(",tF[1],",",x,")=",mod(tF[1],x)]))/*(◆修正部分4)*/;
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"練習3・4 106 2桁の整数Nを9倍して27たすと、百の位は6、十の位は1となるとき、元の整数Nは"/*(◆修正部分1)*/$
KOUSATU:"整数を9倍して、27たすと、9の倍数となり、・・・"/*(◆修正部分1)*/;
M:9;eN:N*9+27=610+X;eX:6+1+X;lX:[];tF:[]/*(◆修正部分2)*/;
for x:0 thru 9 do(if mod(subst(X=x,eX),M)=0 then lX:endcons(x,lX))/*6+1+xが9の倍数になる1桁のxを書き出す*//*(◆修正部分2)*/;
for x in lX do(tF:endcons((610+x-27)/9,tF))/*元の数(610+x-27)/9を書き出す*//*(◆修正部分2)*/;
SUJIMITI:"6+1+Xが( )の倍数になる1桁のXを求め、(610+X-27)/9として、・・・"/*(◆修正部分3)*/$
KAKUNIN:"tFの成分を9倍して27足して確認"/*(◆修正部分4)*/$
for x in lX do( print([tF[1]*9+27,"=",610+x]))/*(◆修正部分4)*/;


   C. 素因数分解
◆コマンド番号107
●素因数分解
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"練習5 107 144を素因数分解は"/*(◆修正部分1)*/$
KOUSATU:"2から順に自然数で割ってゆくと、・・・"/*(◆修正部分1)*/;

KANSUU:"";

N:144;lans:[];lans2:[];i:2;N0:N/*(◆修正部分2)*/;
while N#1 do(if mod(N,i)=0 then (N:N/i,lans:endcons(i,lans))else i:i+1)/*小さい自然数から順に割る*/;
lans:endcons(0,lans);
if length(lans)=1 then lans2:[lans[1]]
/**/else(
/**//**/pw:1,
/**//**/for i:2 thru length(lans) do(
/**//**//**/if lans[i]=lans[i-1] then (pw:pw+1) else (lans2:append(lans2,[lans[i-1],pw]),pw:1)));
lans2;lans3:[];
for i:1 thru length(lans2) step 2 do(lans3:endcons([lans2[i],"^",lans2[i+1]],lans3));
KAITOU:[lans3,"因数分解"]/*解答*/$
SUJIMITI:"2で(  )回割れ、3で(  )回割れて、商は最後に( )になる。"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"因数分解の確認"/*(◆修正部分4)*/$
N1:1;for i:1 thru length(lans2) step 2 do(N1:N1*lans2[i]^lans2[i+1]);
print([N1,"=",N0]);

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"練習5 107 180を素因数分解は"/*(◆修正部分1)*/$
KOUSATU:"2から順に自然数で割ってゆくと、・・・"/*(◆修正部分1)*/;
N:180;lans:[];lans2:[];i:2;N0:N/*(◆修正部分2)*/;


◆コマンド番号108
●素因数分解
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例題2・練習6 108 √(60*n)が自然数になる最小のnは"/*(◆修正部分1)*/$
KOUSATU:"素因数分解の指数が偶数になると、平方根が自然数に・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;

N:60;las:fct(N)/*(◆修正部分2)*/;
as:1;for i:2 thru length(las[1]) step 2 do(if mod(las[1][i],2)#0 then as:as*las[1][i-1])/*素数べき偶数化の余因数as*/;
KAITOU:[as,"求める自然数"]/*解答*/$
SUJIMITI:"素因数分解は(  )となり、素数のべきが偶数となるように、素数の積(  )を掛ける。"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"因数分解の確認"/**/$
print(["√(",N,"*",as,")=",sqrt(N*as),"確認"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例題2・練習6 108 √(168*n)が自然数になる最小のnは"/*(◆修正部分1)*/$
N:168;las:fct(N)/*(◆修正部分2)*/;


◆コマンド番号109
●正の約数をすべて求める
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例3・練習7 109 200の正の約数は"/*(◆修正部分1)*/$
KOUSATU:"素数の指数が、素因数分解の指数以下なら、元の数を・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/

N:200;las:fct(N)/*(◆修正部分2)*/;
lM:[];for i:1 thru length(las[2]) do(lM:endcons(las[2][i][3]+1,lM))/*リストlMは、成分-1が素数に対応する指数の上限*//**/;
lA:[[]];Xr(lM,"A")/*リストlMから、[素数1の指数+1,素数2の指数+1,・・・]作成*//**/;
lA;las;lan:[];for i:1 thru length(lA) do(vE:1,for j:1 thru length(las[2]) do(vE:vE*las[2][j][1]^(lA[i][j]-1)),print(vE),lan:endcons(vE,lan));

KAITOU:[lan,N,"のすべての約数"]/*解答*/$
SUJIMITI:"素数の指数が、素因数分解の指数以下なら、元の数を割り切るので、素数( ),( )の指数がそれぞれ( ),( )以下の負でないものを・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"約数の確認"/**/$
la2:[];for i:1 thru N do(if mod(N,i)=0 then la2:endcons(i,la2));
print([la2,"約数の確認"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例3・練習7 109 60の正の約数は"/*(◆修正部分1)*/$
N:60;las:fct(N)/*(◆修正部分2)*/;


◆コマンド番号110
●正の約数の個数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例4・練習8 110 360の正の約数の個数は"/*(◆修正部分1)*/$
KOUSATU:"素数の指数が、素因数分解の指数以下なら、元の数を・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/

N:360;las:fct(N)/*(◆修正部分2)*/;
lM:[];for i:1 thru length(las[2]) do(lM:endcons(las[2][i][3]+1,lM))/*リストlMは、成分-1が素数に対応する指数の上限*//**/;
lA9:1;for i:1 thru length(lM) do(lA9:lA9*lM[i]);
lM;lA:[[]];Xr(lM,"A")/*リストlMから、[素数1の指数+1,素数2の指数+1,・・・]作成*//**/;
lA;las;lan:[];for i:1 thru length(lA) do(vE:1,for j:1 thru length(las[2]) do(vE:vE*las[2][j][1]^(lA[i][j]-1)),print(vE),lan:endcons(vE,lan));

KAITOU:[lA9,">>",N,"の約数の個数"]/*解答*/$
SUJIMITI:"素数の指数が、素因数分解の指数以下なら、元の数を割り切るので、素数( ),( ),( )の指数がそれぞれ( ),( ),( )だから・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"約数の確認"/**/$
la2:[];for i:1 thru N do(if mod(N,i)=0 then la2:endcons(i,la2));
print([la2,"約数の確認"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例4・練習8 110 450の正の約数の個数は"/*(◆修正部分1)*/$
N:450;las:fct(N)/*(◆修正部分2)*/;


:   2.最大公約数・最小公倍数
   A. 最大公約数・最小公倍数
◆コマンド番号201
●最大公約数・最小公倍数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例5・練習9 201 24,90の最大公約数、最小公倍数は"/*(◆修正部分1)*/$
KOUSATU:"各素因数の指数の小さい方を取れば最大公約数が、大きい方を取れば最小公倍数が・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/

N1:24;N2:90;la1:fct(N1);la2:fct(N2)/*(◆修正部分2)*/;
la11:la1[1];la21:la2[1];iM:length(la11);jM:length(la21);gcml:[];lcml:[];
for k:2 thru max(last(rest(la11,-1)),last(rest(la21,-1))) do(I:0,J:0,
/**/for i:1 thru iM step 2 do(if k=la11[i] then I:i),
/**/for j:1 thru jM step 2 do(if k=la21[j] then J:j),
/**/if I#0 or J#0 then print([k,I,J,if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0]),
/**/if I#0 or J#0 then gcml:endcons([k,min(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0)],gcml),
/**/if I#0 or J#0 then lcml:endcons([k,max(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0)],lcml));
print([gcml,lcml]);
gcm:1;for k:1 thru length(gcml) do gcm:gcm*gcml[k][1]^gcml[k][2];print(gcm);
lcm:1;for k:1 thru length(lcml) do lcm:lcm*lcml[k][1]^lcml[k][2];print(lcm);
print([gcm,lcm]);

KAITOU:[gcm,">>",N1,N2,"の最大公約数",lcm,">>",N1,N2,"の最小公倍数"]/*解答*/$
SUJIMITI:"各素因数の指数の小さい方を取れば最大公約数となるので、素数( ),( ),( )の指数の小さい方がそれぞれ( ),( ),( )だから・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"最大公約数・最小公倍数の確認"/**/$
print([N1/gcm,N2/gcm,"N1,N2の最大公約数による商",lcm/N1,lcm/N2,"N1,N2による最小公倍数の商"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例5・練習9 201 378,840の最大公約数、最小公倍数は"/*(◆修正部分1)*/$
N1:378;N2:840;la1:fct(N1);la2:fct(N2)/*(◆修正部分2)*/;


◆コマンド番号202
●3つ以上の整数の最大公約数・最小公倍数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例6・練習10 202 24,90,126の最大公約数、最小公倍数は"/*(◆修正部分1)*/$
KOUSATU:"各素因数の指数の小さい方を取れば最大公約数が、大きい方を取れば最小公倍数が・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/

N1:24;N2:90;N3:126;la1:fct(N1);la2:fct(N2);la3:fct(N3)/*(◆修正部分2)*/;
la11:la1[1];la21:la2[1];la31:la3[1];iM:length(la11);jM:length(la21);lM:length(la31);gcml:[];lcml:[];
for k:2 thru max(last(rest(la11,-1)),last(rest(la21,-1)),last(rest(la31,-1))) do(I:0,J:0,L:0,
/**/for i:1 thru iM step 2 do(if k=la11[i] then I:i),
/**/for j:1 thru jM step 2 do(if k=la21[j] then J:j),
/**/for l:1 thru lM step 2 do(if k=la31[l] then L:l),
/**/if I#0 or J#0 or L#0 then print([k,I,J,L,if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0,if L#0 then la31[L+1] else 0]),
/**/if I#0 or J#0 or L#0 then gcml:endcons([k,min(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0,if L#0 then la31[L+1] else 0)],gcml),
/**/if I#0 or J#0 or L#0 then lcml:endcons([k,max(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0,if L#0 then la31[L+1] else 0)],lcml));
print([gcml,lcml])$
gcm:1;for k:1 thru length(gcml) do gcm:gcm*gcml[k][1]^gcml[k][2];print(gcm);
lcm:1;for k:1 thru length(lcml) do lcm:lcm*lcml[k][1]^lcml[k][2];print(lcm);
print([gcm,lcm])$

KAITOU:[gcm,">>",N1,N2,N3,"の最大公約数",lcm,">>",N1,N2,N3,"の最小公倍数"]/*解答*/$
SUJIMITI:"各素因数の指数の小さい方を取れば最大公約数となるので、素数( ),( ),( )の指数の小さい方がそれぞれ( ),( ),( )だから・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"最大公約数・最小公倍数の確認"/**/$
print([N1/gcm,N2/gcm,N3/gcm,"N1,N2,N3の最大公約数による商",lcm/N1,lcm/N2,lcm/N3,"N1,N2,N3による最小公倍数の商"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例6・練習10 202 28,84,180の最大公約数、最小公倍数は"/*(◆修正部分1)*/$
N1:28;N2:84;N3:180;la1:fct(N1);la2:fct(N2);la3:fct(N3)/*(◆修正部分2)*/;


◆コマンド番号203
●最大公約数・最小公倍数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例題3・練習11 203 nと12の最小公倍数が180となるnは"/*(◆修正部分1)*/$
KOUSATU:"各素因数の指数の大きい方を取れば最小公倍数が、・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/

N1:12;N2:180;la1:fct(N1);la2:fct(N2)/*(◆修正部分2)*/;
la11:la1[1];la21:la2[1];iM:length(la11);jM:length(la21);gcml:[];lcml:[];nl:[];
for k:2 thru max(last(rest(la11,-1)),last(rest(la21,-1))) do(I:0,J:0,
/**/for i:1 thru iM step 2 do(if k=la11[i] then I:i),
/**/for j:1 thru jM step 2 do(if k=la21[j] then J:j),
/**/if I#0 or J#0 then print([k,I,J,if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0]),
/**/if I#0 or J#0 then gcml:endcons([k,min(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0)],gcml),
/**/if I#0 or J#0 then lcml:endcons([k,max(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0)],lcml));
for k:1 thru length(gcml) do(
/**/if gcml[k][2]=lcml[k][2] then nl:endcons([gcml[k][1],0],nl)else nl:endcons([lcml[k][1],lcml[k][2]],nl));
print([gcml,lcml,nl]);
Nl:[[1]];for k:1 thru length(nl) do(NE:[],
/**/for i:nl[k][2] thru lcml[k][2] do(
/**//**/for j:1 thru length(Nl[k]) do(NE:endcons(Nl[k][j]*nl[k][1]^i,NE))),
/**/Nl:endcons(NE,Nl));
print(Nl);

KAITOU:[last(Nl),">>",N1,"との最小公約数が",N2,"となる数"]/*解答*/$
SUJIMITI:"各素因数の指数の小さい方を取れば最大公約数となるので、素数( ),( ),( )の指数の小さい方がそれぞれ( ),( ),( )だから・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"最大公約数・最小公倍数の確認"/**/$
print([N2/last(Nl),"<<< 解による、解と",N1,"との最大公約数",N2,"の商"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例題3・練習11 203 nと18の最小公倍数が180となるnは"/*(◆修正部分1)*/$
N1:18;N2:180;la1:fct(N1);la2:fct(N2)/*(◆修正部分2)*/;


◆コマンド番号204
●互いに素
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例7・練習12 204 15と28は、互いに素か"/*(◆修正部分1)*/$
KOUSATU:"最大公約数が1となる2数は、共通な素因数がないので、・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/;
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/

N1:15;N2:28;la1:fct(N1);la2:fct(N2)/*(◆修正部分2)*/;
la11:la1[1];la21:la2[1];iM:length(la11);jM:length(la21);gcml:[];lcml:[];nl:[];
for k:2 thru max(last(rest(la11,-1)),last(rest(la21,-1))) do(I:0,J:0,
/**/for i:1 thru iM step 2 do(if k=la11[i] then I:i),
/**/for j:1 thru jM step 2 do(if k=la21[j] then J:j),
/**/if I#0 or J#0 then print([k,I,J,if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0]),
/**/if I#0 or J#0 then gcml:endcons([k,min(if I#0 then la11[I+1] else 0,if J#0 then la21[J+1] else 0)],gcml));
gcm:1;for k:1 thru length(gcml) do(gcm:gcm*gcml[k][1]^gcml[k][2]);
print(gcm);
if gcm=1 then tF:true else tF:false;
KAITOU:[tF,">>",N1,"と",N2,"は互いに素"]/*解答*/$
SUJIMITI:"N1の素因数は、( ),( )、N2の素因数は( ),( ),だから・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"1以外の公約数の確認"/**/$
kknnl:[];for i:1 thru 100 do(if mod(N1,i)=0 and mod(N2,i)=0 then kknnl:endcons(i,kknnl)); print([kknnl,"<<< N1,N2の100以下の公約数"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例7・練習12 204 4と30は、互いに素か"/*(◆修正部分1)*/$
N1:4;N2:30;la1:fct(N1);la2:fct(N2)/*(◆修正部分2)*/;


◆コマンド番号205
●互いに素
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例題4・練習13 205 aを自然数とし、a+3が4の倍数、a+4が7の倍数なら、a+11は28の倍数か"/*(◆修正部分1)*/$
KOUSATU:"aについての2つの式を、aについて解き、3つ目の式に代入して、互いに素な整数a,bの倍数になっているか判断し、・・・"/**/;

KANSUU:"";
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$

declare(c1,integer)$declare(c2,integer)$
N1:4;N2:7;gcm12:gcm(N1,N2);e1:a+3=N1*c1;e2:a+4=N2*c2;e3:a+11/*(◆修正部分2)*/;
tS:if gcm12=1 then true else false;
sa1:solve(e1,a)[1];e34:factor(subst(sa1,e3));tF34:if mod(e34,N1)=0 then true else false;
sa2:solve(e2,a)[1];e37:factor(subst(sa2,e3));tF37:if mod(e37,N2)=0 then true else false;
tF28:if tS and tF34 and tF37 then true else false;

KAITOU:[tF28,">>",e3,"は",N1*N2,"の倍数"]/*解答*/$
SUJIMITI:"N1の素因数は、( ),( )、N2の素因数は( ),( ),だから・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"1以外の公約数の確認"/**/$
kknnl:[];for A:1 thru 100 do(if mod(subst(a=A,lhs(e1)),N1)=0 and mod(subst(a=A,lhs(e2)),N2)=0 then kknnl:endcons(subst(a=A,e3),kknnl));
print([kknnl,"<<< ",lhs(e1),"が",N1,"の,",lhs(e2),"が",N2,"の100以下の倍数となるときの",e3])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例題4・練習13 205 aを自然数とし、a+3が4の倍数、a+4が7の倍数なら、a+11は28の倍数か"/*(◆修正部分1)*/$
N1:5;N2:9;gcm12:gcm(N1,N2);e1:a+1=N1*c1;e2:a+2=N2*c2;e3:a+11/*(◆修正部分2)*/;


   研究. 最大公約数・最小公倍数の性質
◆コマンド番号206
●最大公約数・最小公倍数の性質
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例1 206 最大公約数が12、最小公倍数が72となる2つの整数a,b(a<b)は"/*(◆修正部分1)*/$
KOUSATU:"a:12*c1,b=12*c2とおくと、c1,c2は互いに素、12*c1*c2=72となるので、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$

declare(c1,integer)$declare(c2,integer)$
g:12;l:72;N1:12*c1;N2:12*c2;e1:l=N1*N2/g;e2:c12=c1*c2/*(◆修正部分2)*/;
sc1:solve(e2,c1)[1];sc12:solve(subst(sc1,e1),c12)[1];fc12:fct(rhs(sc12));
HANDAN:"fc12の結果を見て、以下のc11,c21,c12,c22を構成";
c11l:[2,0,3,0];c21l:[2,1,3,1];
c12l:[2,1,3,0];c22l:[2,0,3,1];
c11:unf(c11l);c21:unf(c21l);c12:unf(c12l);c22:unf(c22l);
sc12:[[g*c11,g*c21],[g*c12,g*c22]];

KAITOU:[sc12,">>は求める解[a,b]の組合せ"]/*解答*/$
SUJIMITI:"互いに素なc1,c2の積の素因数は、( ),( )で、c1,c2は共通な素因数を持たないので、・・・"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"最大公約数、最小公倍数の確認"/**/$
gcm1:gcm(sc12[1][1],sc12[1][2]);lcm1:lcm(sc12[1][1],sc12[1][2]);gcm2:gcm(sc12[2][1],sc12[2][2]);lcm2:lcm(sc12[2][1],sc12[2][2]);
kknn:[[gcm1,lcm1],[gcm2,lcm2]];
print([kknn,"<<< ",kknn[1],"が",sc12[1],"の最大公約数、最小公倍数",kknn[1],"が",sc12[2],"の最大公約数、最小公倍数"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例1 206 最大公約数が12、最小公倍数が144となる2つの整数a,b(a<b)は"/*(◆修正部分1)*/$
g:12;l:144;N1:12*c1;N2:12*c2;e1:l=N1*N2/g;e2:c12=c1*c2/*(◆修正部分2)*/;


:   3.整数の割り算と商・余り
   A. 整数の割り算における商と余り
◆コマンド番号301
●割り算の商と余り
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例8・練習14 301 35を4で割ったとき、商と余りは"/*(◆修正部分1)*/$
KOUSATU:"a=b*q+r, 0<=r<bとなるので、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

n1:35;n2:4/*(◆修正部分2)*/;
q:quon(n1,n2);r:mod(n1,n2);
anl:[q,r];

KAITOU:[anl,">>[商、余り]"]/*解答*/$
SUJIMITI:"数直線上で、被除数は、除数を何回分進めば[商]( )、残りが除数より小さい正数[余り]( )になるか"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
N1:n2*qn+rn;tF:if N1=n1 then true else false;
kknn:[tF,N1,n2,[qn,rn]];
print([kknn,"<<< ",kknn[4],"が",n1,"を",n2,"で割った商と余り"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例8・練習14 301 -20を3で割ったとき、商と余りは"/*(◆修正部分1)*/$
n1:-20;n2:3/*(◆修正部分2)*/;


◆コマンド番号302
●割り算の商と余り
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例題5・練習15 302 7で割ると5余る整数aと7で割ると4余る整数bとの和は、7で割ると余りは"/*(◆修正部分1)*/$
KOUSATU:"a=b*q+r, 0<=r<bとなるので、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

declare(q1,integer,q2,integer);
N1:7;r1:5;r2:4;a:q1*n1+r1;b:q2*n1+r2;e:a+b/*(◆修正部分2)*/;
r:mod(subst(n1=N1,coeff(expand(e),n1,0)),N1);
anl:[r];

KAITOU:[anl,">>[余り]"]/*解答*/$
SUJIMITI:"和の余りは余りの和の余り( )、積の余りは余りの積の余り( )"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
kknn:[];
for i:1 thru 100 do(
/**/for j:1 thru 100 do(if mod(i,N1)=r1 and mod(j,N1)=r2 then kknn:endcons([i,j,mod(i+j,N1)],kknn)))/*(◆修正部分3)*/;
print([kknn,"<<< ",N1,"で割って",r1,"余る数と",r2,"余る数との和を",N1,"で割った余りの例"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例題5・練習15 302 5で割ると3余る整数aの平方と5で割ると4余る整数bの平方との和は、5で割ると余りは"/*(◆修正部分1)*/$
N1:5;r1:3;r2:4;a:q1*n1+r1;b:q2*n1+r2;e:a^2+b^2/*(◆修正部分2)*/;
/**/for j:1 thru 100 do(if mod(i,N1)=r1 and mod(j,N1)=r2 then kknn:endcons([i,j,mod(i^2+j^2,N1)],kknn))/*(◆修正部分3)*/;


◆コマンド番号303
●余りによる整数の分類
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例題6・練習16 303 奇数の2乗から1引いた数は8の倍数か"/*(◆修正部分1)*/$
KOUSATU:"奇数は、a=2*q+1となるので、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

declare(q,integer,k1,integer,k2,integer);
a:2*q+1;Q1:2*k1;Q2:2*k2+1;e:factor(expand(a^2-1))/*(◆修正部分2)*/;
e1:subst(q=Q1,e);e2:subst(q=Q2,e)/*qが偶数の場合と奇数の場合*/;
r1:mod(e1,8);r2:mod(e2,8);
anl:[r1,r2];

KAITOU:[anl,">>[qが偶数のときaを8で割った余り、qが奇数のときaを8で割った余り]"]/*解答*/$
SUJIMITI:"奇数を作るときの整数を、偶数と(  )の場合に分けて考えると、"/**/$
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
kknn:[];
for i:1 thru 100 do(
/**/if mod(i,2)=1 then kknn:endcons([i,i^2-1,mod(i^2-1,8)],kknn))/*(◆修正部分3)*/;
print([kknn,"<<< [奇数、奇数の2乗-1、8で割った余り]の例"])$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例題6・練習16 303 連続する2つの偶数の2乗の和から4を引いた数は16の倍数か"/*(◆修正部分1)*/$
a1:2*q;a2:2*q+2;Q1:2*k1;Q2:2*k2+1;e:factor(expand(a1^2+a2^2-4))/*(◆修正部分2)*/;
/**/if mod(i,2)=0 then kknn:endcons([i,i^2,(i+2)^2,mod(i^2+(i+2)^2-4,8)],kknn))/*(◆修正部分3)*/;


◆コマンド番号304
●余りによる整数の分類
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"応用例題1・練習17 304 nを整数として、n^2を3で割った余りは"/*(◆修正部分1)*/$
KOUSATU:"整数は、a=3*q,a=3*q+1,a=3*q+2,と分類できるので、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

declare(q,integer,k,integer);
a:q;Q1:n*k+1;Q2:n*k+2;Q3:n*k;e:a^2/*nは後に必要があれば3を代入*//*(◆修正部分2)*/;
e1:expand(subst(q=Q1,e));e2:expand(subst(q=Q2,e));e3:expand(subst(q=Q3,e))/*qは、3で割って、余り1の場合と、余り2の場合と、割り切れる場合と*//*(◆修正部分2)*/;
e1:coeff(e1,n,0);e2:coeff(e2,n,0);e3:coeff(e3,n,0)/*n(3)で割った余りは、nの式とみなしたときの定数項*//*(◆修正部分2)*/;
r1:mod(e1,3);r2:mod(e2,3);r3:mod(e3,3)/*余り(定数項)を3で割った余り*//*(◆修正部分2)*/;
anl:[r1,r2,r3]/*(◆修正部分2)*/;

KAITOU:[anl,">>[qが3で割って余り1の場合、2の場合、0の場合、のそれぞれの余り]"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"整数を、3で割って余り(  )の場合、(  )の場合、(  )の場合、に分けて考えると、"/*(◆修正部分3)*/;
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
kknn:[];
for i:1 thru 100 do(
/**/kknn:endcons([i,i^2,mod(i^2,3)],kknn))/*(◆修正部分4)*/;
print([kknn,"<<< [整数、整数の2乗、整数の2乗を3で割った余り]の例"])/*(◆修正部分4)*/$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"応用例題1・練習17 304 nを整数として、n^2を4で割った余りは"/*(◆修正部分1)*/$
a:q;Q1:n*k+1;Q2:n*k+2;Q3:n*k+3;Q4:n*k;e:a^2/*nは後に必要があれば4を代入*//*(◆修正部分2)*/;
e1:expand(subst(q=Q1,e));e2:expand(subst(q=Q2,e));e3:expand(subst(q=Q3,e));e4:expand(subst(q=Q4,e))/*qは、4で割って余り1の場合と、・・・*//*(◆修正部分2)*/;
e1:coeff(e1,n,0);e2:coeff(e2,n,0);e3:coeff(e3,n,0);e4:coeff(e4,n,0)/*n(4)で割った余りは、nの式とみなしたときの定数項*//*(◆修正部分2)*/;
r1:mod(e1,4);r2:mod(e2,4);r3:mod(e3,4);r4:mod(e4,4)/*余り(定数項)を4で割った余り*//*(◆修正部分2)*/;
anl:[r1,r2,r3,r4]/*(◆修正部分2)*/;
KAITOU:[anl,">>[qが4で割って余り1の場合、2の場合、3の場合、0の場合、のそれぞれの余り]"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"整数を、4で割って余り(  )の場合、・・・に分けて考えると、"/*(◆修正部分3)*/;
/**/kknn:endcons([i,i^2,mod(i^2,4)],kknn))/*(◆修正部分4)*/;
print([kknn,"<<< [整数、整数の2乗、整数の2乗を4で割った余り]の例"])/*(◆修正部分4)*/$


:   研究・発展・補充問題
   研究
◆コマンド番号30101
●研究
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例1 30101 整数aをmで割った余りがrとして、a^k (kは正の整数)をmで割った余りは"/*(◆修正部分1)*/$
KOUSATU:"整数は、a=m*q+rと表現できるので、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

declare(m,integer,q,integer,r,integer,k,integer);
a:m*q+r;e:a^k/*nは後に必要があれば3を代入*//*(◆修正部分2)*/;
e:taylor(e,m,0,5)/*eをmの昇べきの順に展開*//**/;
r:coeff(e,m,0);r:mod(r,m)/*mで割った余りは、mの式とみなしたときの定数項をmで割った余り*//*(◆修正部分3)*/;
anl:[r]/**/;

KAITOU:[anl,">>[aがmで割って余りrのとき、a^kをmで割った余りはr^kをmで割った余り]"]/*解答*//*(◆修正部分4)*/$
SUJIMITI:"aをmの式として昇べきの順に展開すると、最初の3項は(  )となり、・・・"/**/;
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
kknn:[];
for i:5 thru 20 step 5 do(/*(◆修正部分5)*/
/**/for j:1 thru 20 do(kknn:endcons([i,j,i^j,mod(i^j,4)],kknn)))/*(◆修正部分5)*/;
print([kknn,"<<< [5のj乗を4で割った余り]の例"])/*(◆修正部分5)*/$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例1 30101 5^100を4で割った余りは"/*(◆修正部分1)*/$
a:m+1;e:a^100/*mは後に必要があれば4を代入*//*(◆修正部分2)*/;
r:coeff(e,m,0);r:subst(m=4,mod(r,m))/*mで割った余りは、mの式とみなしたときの定数項をmで割った余り*//*(◆修正部分3)*/;
KAITOU:[anl,">>[5^100を4で割った余りは]"]/*解答*//*(◆修正部分4)*/$
kknn:endcons(mod(5^100,4),kknn)/*(◆修正部分5)*/;
print([kknn,"<<< [5の100乗を4で割った余り]の例"])/*(◆修正部分5)*/$


   発展
◆コマンド番号30102
●合同式
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"例1・例2 30102 5^100を4で割った余りaは"/*(◆修正部分1)*/$
KOUSATU:"5^100を4で割った余りa、すなわちa=mod(5^100,4)は、5^100≡a (mod 4)となる最小の正数aだから、・・・"/*(◆修正部分1)*/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

a1:mod(5,4)/*5≡a1 (mod 4) (a1は最小の正数)*//*(◆修正部分2)*/;
a2:mod(5,4)^100/*5^100(≡a1^100)≡a2 (mod 4) (a2は最小の正数)*//*(◆修正部分2)*/;
a3:mod(5^100,4)/*5^100(≡a2)≡a3 (mod 4) (a3は最小の正数)*//*(◆修正部分2)*/;
e3:a3/*(◆修正部分2)*/;
anl:[e3];
KEISAN:"以上の結果から、計算は、";
KEISAN2:"5≡1(mod 4) → 5^100≡1^100(mod 4) → ≡1(mod 4) → 解は1"/*(◆修正部分3)*/;

KAITOU:[anl,">>[5^100を4で割った余り]"]/*解答*//*(◆修正部分4)*/$
SUJIMITI:"余りは合同式で計算できて、最初は冪のない合同式(  )から始まり、・・・"/**/;
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
kknn:[mod(5^100-1,4)]/*(◆修正部分5)*/;
print([kknn,"<<< [5^100-1を4で割った余り]だから、5^100を4で割った余りは1"])/*(◆修正部分5)*/$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"例1・例2 30102 正の整数nを5で割った余りが3のとき、n^4を5で割った余りは"/*(◆修正部分1)*/$
KOUSATU:"n^4を5で割った余りa、すなわちa=mod(n^4,5)は、n^4≡a (mod 5)となる最小の正数aだから、・・・"/*(◆修正部分1)*/;
e1:3=mod(n,n5)/*n≡3 (mod 5) (a1は最小の正数) n5は後に5とする*//*(◆修正部分2)*/;
e1:n=n5*q+3/*(◆修正部分2)*/;
e2:a2=mod(n,n5)^4/*n^4(≡a1^4)≡a2 (mod 5) (a2は最小の正数)*//*(◆修正部分2)*/;
e3:a3=mod(n^4,n5)/*n^4(≡a2)≡a3 (mod 5) (a3は最小の正数)*//*(◆修正部分2)*/;
e3:a3=coeff(taylor(subst(e1,n^4),n5,0,3),n5,0)/*maximaでのmod(n^4,n5)の計算(◆修正部分2)*/;
e3:mod(rhs(e3),5)/*n5を5にする(◆修正部分2)*/;
KEISAN2:"n≡3(mod 5) → n^4≡3^4(mod 5) → ≡81(mod 5) → ≡1(mod 5) → 解は1"/*(◆修正部分3)*/;
KAITOU:[anl,">>[n^4を5で割った余り]"]/*解答*//*(◆修正部分4)*/$
kknn:[]/*(◆修正部分5)*/;
for i:1 thru 100 do(if mod(i,5)=3 then kknn:endcons([i,mod(i,5),mod(i^4,5)],kknn))/*(◆修正部分5)*/;
print([kknn,"<<< [n≡3 (mod 5) となるn、mod(n,5)、mod(i^4,5)]の例"])/*(◆修正部分5)*/$


   補充問題
◆コマンド番号30103
●倍数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"補充問題1 30103 a,bが3の倍数なら、2*a+bは3の倍数か"/*(◆修正部分1)*/$
KOUSATU:"a=3*q1,b=3*q2となり、・・・"/**/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

a:n3*q1;b:n3*q2;e1:2*a+b/*(◆修正部分2)*/;
tF:if mod(coeff(taylor(e1,n3,0,3),n3,0),3)=0 then true else false/*(◆修正部分2)*/;
anl:[tF];

KAITOU:[anl,">>3の倍数"]/*解答*//*(◆修正部分3)*/$
SUJIMITI:"aを( )*q1、bを( )*q2と表して、・・・"/**/;
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"確認"/**/$
kknn:[]/**/;
for a:1 thru 100 do(
/**/for b:1 thru 100 do(
/**//**/if mod(a,3)=0 and mod(b,3)=0 then kknn:endcons([a,b,2*a+b,mod(2*a+b,3)],kknn)))/*(◆修正部分4)*/$
print([kknn,"<<< [a,b,2*a+b,mod(2*a+b,3)]の例"])/*(◆修正部分4)*/$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"補充問題1 30103 a,bが3の倍数なら、a^2+a*b+b^2は9の倍数か"/*(◆修正部分1)*/$
a:n3*q1;b:n3*q2;e1:a^2+a*b+b^2/*(◆修正部分2)*/;
tF:if mod(coeff(taylor(e1,n3,0,3),n3,0),9)=0 then true else false/*(◆修正部分2)*/;
KAITOU:[anl,">>9の倍数"]/*解答*//*(◆修正部分3)*/$
/**//**/if mod(a,3)=0 and mod(b,3)=0 then kknn:endcons([a,b,a^2+a*b+b^2,mod(a^2+a*b+b^2,9)],kknn)))/*(◆修正部分4)*/$
print([kknn,"<<< [a,b,a^2+a*b+b^2,mod(a^2+a*b+b^2,9)]の例"])/*(◆修正部分4)*/$


   コラム
◆コマンド番号30104
●完全数
●●●●●●●●●●●●●●●●
kill(all) /**/$
MONDAI:"コラム 30104 2^k*(2^(k+1)-1)は、第2因子2^k*(2^(k+1)-1)が素数なら完全数か"/*(◆修正部分1)*/$
KOUSATU:"完全数とは、それ自身以外の正の約数の和がそれ自身となる数で、問題の数の約数は2^i*(2^(k+1)-1)^j (i=0,1,...,k,j=0,1)だから、・・・"/*(◆修正部分1)*/;

KANSUU:"";
unf(list):=block([i,iM,p],iM:length(list),p:1,
/**/for i:1 thru iM step 2 do(p:p*list[i]^list[i+1]),p:p)$
fct(n):=block([la,l2,l3,i,pw],la:[],l2:[],l3:[],i:2,
/**/while n#1 do(if mod(n,i)=0 then (n:n/i,la:endcons(i,la)) else i:i+1),la:endcons(0,la)/*素因数list1、最後0*/,
/**/if length(la)=2 then l2:[la[1],1] else(pw:1,
/**//**/for i:2 thru length(la) do(if la[i]=la[i-1] then (pw:pw+1) else (l2:append(l2,[la[i-1],pw]),pw:1))),
/**/for i:1 thru length(l2) step 2 do(l3:endcons([l2[i],"^",l2[i+1]],l3)),l3:[l2,l3])/*[素因数list2,素因数分解]*/$
lng(n,list,sw):=block([D,i,iM,V],D:true,iM:length(list),
/**/for i:1 thru iM do(if (sw="N"and n=list[i]) or (sw="G" and list[i]>=n ) or (sw="L"and n>=list[i]) then D:false),V:D)/*[スイッチごとにTF判定]*/$
Xr(list,sw):=block([r,i,j],/*print("nHr",lA,length(lA[1]),r),*/ /**/r:length(list),
/**/while r>length(lA[1]) do(/*print(length(lA[1]),r),*/
/**//**/iM:length(lA),lEA:[],/*print(iM),*/
/**//**/for i:1 thru iM do(
/**//**//**/lL:lA[i],/*print("listi",list[i]),*/
/**//**//**/for j:1 thru list[length(lA[iM])+1] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))/*listから順列作成、スイッチは、1324>>sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/$
load ("functs")$
gcm(n1,n2):=n1*n2/lcm(n1,n2)$
quon(n1,n2):=block([qn,rn],rn:mod(n1,n2),qn:quotient(n1-rn,n2))$

n:2^k*(2^(k+1)-1);
s1:sum(2^i,i,0,k),simpsum/*約数2^i (i=0,1,..,k)の和*/;
s2:sum(s1*2^i,i,0,k-1),simpsum/*約数2^i*(2^(k+1)-1) (i=0,1,..,k-1)の和*/;
m:factor(s1+s2)/*自分以外の正の約数の和*/;
anl:[n,m,"完全数"];

KAITOU:anl/*[n,m,"完全数"]解答*//*(◆修正部分4)*/$
SUJIMITI:"2^(k+1)-1は、約数2^i (i=0,1,2,...,k)の(  )であり、同時に約数の1つで、それが素数なら、・・・"/**/;
FURIKAERI:"(例:具体的な数値で、3での整除を現認など、実行者の振り返りを書きこむこと)"$

KAKUNIN:"商と余りの確認"/**/$
kknn:[]/*(◆修正部分5)*/;
for k:1 thru 10 do(n:2^k*(2^(k+1)-1),m:0,
/**/if primep(2^(k+1)-1) then(
/**//**/for i:0 thru k do(
/**//**//**/for j:0 thru 1 do(
/**//**//**//**/if i#k or j#1 then m:m+2^i*(2^(k+1)-1)^j)),
/**//**/kknn:endcons([k,2^(k+1)-1,n,m,"完全数"],kknn)))$
print([kknn,"<<< [k,2^(k+1)-1,n,m,完全数]の例"])/*(◆修正部分5)*/$

print(MONDAI)$
print(SUJIMITI)$
print(KAITOU)$
print(FURIKAERI)$

◎上のMaximaコマンドを実行し、結果を考察せよ。