:
Maxima数学A自習教材開発
教材の概要
1場合の数と確率 1)場合の数
1.場合の要素の個数
2.場合の数
3.順列
4.組合せ
101.補充問題
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
:
第1章場合の数と確率
第1節場合の数
1.場合の要素の個数
A 集合の要素の個数
集合の要素の個数
◆コマンド番号101
●例1・練習1
集合の要素の個数●●●●●●●●●●●●●●●●
kill(all) /* "101 集合の要素の個数(◆Maxima on lineでは省略)" */$
MONDAI:"101 全体集合U、部分集合A、Bについて、U={1,2,3,4,5,6}、A={1,2,3,4}、B={2,4,6}のとき、"$
U:{1,2,3,4,5,6} /* "全体集合" */;
A:{1,2,3,4} /* "部分集合A" */;
B:{2,4,6} /* "部分集合B" */;
nU:cardinality(U);
MONDAI1:"n(A),n(B),n(Ac),n(AuB)は(◆修正部分)"$
Ac:setdifference(U,A) /* "Aの補集合(◆修正部分)" */;
AuB:union(A,B) /* "AとBの和集合(◆修正部分)" */;
nA:cardinality(A) /* "Aの要素の個数(◆修正部分)" */;
nAc:cardinality(Ac) /* "Acの要素の個数(◆修正部分)" */;
nB:cardinality(B) /* "Bの要素の個数(◆修正部分)" */;
nAuB:cardinality(AuB) /* "AuBの要素の個数(◆修正部分)" */;
KAITOU:[nA,nB,nAc,nAuB] /* "解答(◆◆修正時訂正)" */;
print(MONDAI)$
print(MONDAI1)$
print(KAITOU)$
KAKUNIN:"一覧表で確認"$
mU:matrix(["U","B","Bc","合計"],["A",nAnB,nA-nAnB,nA],["Ac",nB-nAnB,(nU-nA)-(nB-nAnB),nU-nA],["合計",nB,nU-nB,nU]) /* "一覧表で確認" */;
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"n(AnBc)は(◆修正部分)"$
Bc:setdifference(U,B) /* "Bの補集合(◆修正部分)" */;
AnBc:intersection(A,Bc) /* "AとBcの共通部分(◆修正部分)" */;
nAnBc:cardinality(AnBc) /* "AnBCの要素の個数(◆修正部分)" */;
◆コマンド番号102
●例2・練習2
和集合、補集合の要素の個数●●●●●●●●●●●●●●●●
kill(all) /* "102 和集合、補集合の要素の個数" */$
MONDAI:"102 全体集合U、部分集合A,Bについて、n(U)=40,n(A)=18,n(B)=25,n(AnB)=6のとき、" $
nU:40 /* "n(U)の値" */;
nA:18 /* "n(A)の値" */;
nB:25 /* "n(B)の値" */;
nAnB:6 /* "n(AnB)の値" */;
MONDAI1:"n(AuB),n(Ac)は(◆修正部分)";
nAuB:nA+nB-nAnB /* "n(AuB)の値(◆修正部分)" */;
nAc:nU-nA /* "n(Ac)の値(◆修正部分)" */;
KAITOU:[nAuB,nAc] /* "解答(◆◆修正時訂正)" */;
print(MONDAI)$
print(MONDAI1)$
print(KAITOU)$
KAKUNIN:"一覧表で確認"$
mU:matrix(["U","B","Bc","合計"],["A",nAnB,nA-nAnB,nA],["Ac",nB-nAnB,(nU-nA)-(nB-nAnB),nU-nA],["合計",nB,nU-nB,nU]) /* "一覧表で確認" */;
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"n(Bc),n((AuB)c),n(AcnBc)は(◆修正部分)";
nBc:nU-nB /* "n(Ac)の値(◆修正部分)" */;
nAuB:nA+nB-nAnB /* "n(AuB)=n(U)-n(A)-n(B)+n(AnB)だから(◆修正部分)" */;
nLAuBJc:nU-nAuB /* "n((AuB)c)=n(U)-n(AuB)だから(◆修正部分)" */;
nAcnBc:nLAuBJc /* "AcnBc=(AuB)cだから(◆修正部分)" */;
B 倍数の個数
◆コマンド番号103
●例題1・練習3
同類項の整理●●●●●●●●●●●●●●●●
kill(all) /* "103 倍数の個数" */$
MONDAI:"103 100以下の自然数のうち"$
U:{} /* "全体集合Uの初期化" */;
MONDAI1:"3の倍数、3の倍数でない数、3の倍数かつ5の倍数、3の倍数または5の倍数の個数は(◆修正部分)";
(a:3,b:5) /* "aは3,bは5と指定(◆◆修正部分)" */;
A:{} /* "部分集合A(3の倍数の集合)の初期化(◆修正時訂正)" */;
B:{} /* "部分集合B(5の倍数の集合)の初期化(◆修正時訂正)" */;
AnB:{} /* "部分集合AnB(3の倍数かつ5の倍数の集合)の初期化(◆修正時訂正)" */;
for i:1 thru 100 do(
/**/U:append({i},U),
/**/if mod(i,a)=0 then A:append({i},A),
/**/if mod(i,b)=0 then B:append({i},B),
/**/if mod(i,a)=0 and mod(i,b)=0 then AnB:append({i},AnB));
print(U);print(A);print(B);print(AnB) /* "U,A,B,AnBの表示" */;
AuB:union(A,B);
nU:cardinality(U) /* "Uの要素の個数" */;
nA:cardinality(A) /* "Aの要素の個数" */;
fix(100/a) /* "nAは100/3の整数部分" */;
nB:cardinality(B) /* "Bの要素の個数" */;
fix(100/b) /* "nBは100/5の整数部分" */;
nAnB:cardinality(AnB) /* "AnBの要素の個数" */;
fix(100/(a*b)) /* "nAnBは100/(3*5)の整数部分" */;
nAc:nU-nA;
nAuB:nA+nB-nAnB;
KAITOU:[nA,nAc,nAnB,nAuB] /* "解答リスト" */;
print(MONDAI)$
print(MONDAI1)$
print(KAITOU)$
KAKUNIN:"一覧表で確認"$
mU:matrix(["U","B","Bc","合計"],["A",nAnB,nA-nAnB,nA],["Ac",nB-nAnB,(nU-nA)-(nB-nAnB),nU-nA],["合計",nB,nU-nB,nU]) /* "一覧表で確認" */;
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"6の倍数、6の倍数でない数、4の倍数かつ6の倍数、4の倍数または6の倍数の個数は(◆修正部分)";
(a:6,b:4) /* "aは6,bは4と指定(◆◆修正部分)" */;
C 集合の応用
◆コマンド番号104
●応用例題1・練習4・練習5
集合の応用●●●●●●●●●●●●●●●●
kill(all) /* "104 集合の応用" */$
MONDAI:"104 100人のa案、b案への賛否について"$
MONDAI1:"a賛成77人、b賛成83人、aもbも賛成66人。aもbも反対は(◆修正部分)"$
nU:100 /* "全体Uの人数(◆修正部分)" */;
nA:77 /* "a賛成の人数(◆修正部分)" */;
nB:83 /* "b賛成の人数(◆修正部分)" */;
nAnB:66 /* "aもbも賛成の人数(◆修正部分)" */;
nAc:nU-nA;
nAuB:nA+nB-nAnB;
nAcnBc:nU-nAuB;
KAITOU:[nAcnBc] /* "解答リスト(◆修正部分2)" */;
print(MONDAI)$
print(MONDAI1)$
print(KAITOU)$
KAKUNIN:"一覧表で確認"$
mU:matrix(["U","B","Bc","合計"],["A",nAnB,nA-nAnB,nA],["Ac",nB-nAnB,(nU-nA)-(nB-nAnB),nU-nA],["合計",nB,nU-nB,nU]) /* "一覧表で確認" */;
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"40人について、自転車利用13人、バス利用16人、自転車もバスも利用5人。自転車もバスも利用しない人、自転車だけ利用する人は(◆修正部分)"$
nU:40 /* "全体Uの人数(◆修正部分)" */;
nA:13 /* "自転車利用の人数(◆修正部分)" */;
nB:16 /* "バス利用の人数(◆修正部分)" */;
nAnB:5 /* "自転車もバスも利用の人数(◆修正部分)" */;
nAnBc:nA-nAnB /* "(◆修正部分2)" */;
KAITOU:[nAcnBc,nAnBc] /* "解答リスト(◆修正部分2)" */;
:
2.場合の数
A 樹形図
◆コマンド番号201
●練習6
樹形図●●●●●●●●●●●●●●●●
kill(all) /* "201 樹形図" */$
MONDAI:"105 次の図で"$
MONDAI0:"C─F─H(◆修正部分)"$
MONDAI0:"│ │ │(◆修正部分)"$
MONDAI0:"A─D─G(◆修正部分)"$
MONDAI0:"│ │ │(◆修正部分)"$
MONDAI0:"O─B─E(◆修正部分)"$
MONDAI:"OからHに行く最短の道順の樹形図は(◆修正部分)"$
mA:matrix( /*"(◆修正部分)" */
[1,2,2,0,0,0,0,0,0] /*"O(◆修正部分)" */,
[0,1,0,2,2,0,0,0,0] /*"O(◆修正部分)" */,
[0,0,1,0,2,2,0,0,0] /*"O(◆修正部分)" */,
[0,0,0,1,0,0,2,0,0] /*"O(◆修正部分)" */,
[0,0,0,0,1,0,2,2,0] /*"O(◆修正部分)" */,
[0,0,0,0,0,1,0,2,0] /*"O(◆修正部分)" */,
[0,0,0,0,0,0,1,0,2] /*"O(◆修正部分)" */,
[0,0,0,0,0,0,0,1,2]) /*"O(◆修正部分)" */;
iM:8;jM:9;kM:1 /*"(◆修正部分)" */;
take(n,list):=rest(list,n-length(list))$
zJ():=block(
/**/iM:length(lA),jM:length(lA[1]),
/**/bB:[],
/**/for j:1 thru jM do(
/**//**/for i:1 thru iM do(
/**//**//**/bN:take(j,lA[i]),
/**//**//**/if bB#bN then (lB:endcons(bN,lB),bB:bN) /*else(print(bB,bN))*/
/**//**//**/)))$/*"樹形図構成過程(lB)まとめ"*/
sJ():=block(
/**/iM:length(lB),
/**/nB:1,dB:[],nC:0,lCe:[],
/**/for i:1 thru iM do(
/**//**/nN:length(lB[i]),dN:take(nN-1,lB[i]),/*display(i,nB,nN,dB,dN),*/
/**//**/if nB=nN then(
/**//**//**//**/if dB=dN then(
/**//**//**//**//**//**/nC:nC+1/*,display(dB,dN,nC)*/
/**//**//**//**//**/)else(lCe:endcons(nC,lCe),dB:dN,nC:1/*,display(dB,dN,nC,lCe)*//*,display(i,nB,dB,lCe)*/)
/**//**//**/)else(lCe:endcons(nC,lCe),lC:endcons(lCe,lC)/*,display(lC,lCe)*/,nC:1,nB:nN,dB:dN,lCe:[])),
/**/lCe:endcons(nC,lCe),lC:endcons(lCe,lC))$/*"樹形図構成点(lC)まとめ"*/
mJ():=block([idB],
/**/nlC:[0],
/**/lP:[">"," ","―","├","│","└","┬"],
/**/lJ0:[lP[2]],lJe:[lP[1]],iM:length(lC),lJ1:lJ0,idB:0,
/**/for i:1 thru iM do(
/**//**/jM:length(lC[i]),/*display(lC[i]),*/
/**//**/nlC:endcons(lsum(i1,i1,lC[i]),nlC),
/**//**/for j:1 thru jM do(
/**//**//**/if i#1 then (lJe:lJ[j+lsum(ls,ls,take(i-1,nlC))]),
/**//**//**/if i#1 and j=jM then lJ0:lJ1,
/**//**//**/kM:lC[i][j],/*display(lC[i][j]),*/
/**//**//**/for k:1 thru kM do(
/**//**//**//**/if k=1 then (
/**//**//**//**//**//**/if k=kM then lJee:endcons(lP[3],lJe) else lJee:endcons(lP[7],lJe),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)elseif k=kM then(
/**//**//**//**//**//**/lJeee:[" "],lM:length(lJee),
/**//**//**//**//**//**/for l:2 step 2 thru lM -2 do(
/**//**//**//**//**//**//**/if lJee[l]=lP[7]or lJee[l]=lP[5] or lJee[l]=lP[4] then (lJeee:endcons(lP[5],lJeee),lJeee:endcons(" ",lJeee))
/**//**//**//**//**//**//**//**/else (lJeee:endcons(" ",lJeee),lJeee:endcons(" ",lJeee)) ),
/**//**//**//**//**//**/lJee:endcons(lP[6],lJeee),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)else(
/**//**//**//**//**//**/lJee:endcons(lP[4],lJ0),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/),
/**//**//**//**/lJ:endcons(lJee,lJ) /*,display(lJ)*/
/**//**//**//**/)
/**//**//**/,idB:idB+lC[i][j]
/**//**//**/),
/**//**//**//**/lJ0:endcons(lP[5],lJ0) ,
/**//**//**//**/lJ0:endcons(lP[2],lJ0),/*display(lJ0),*/
/**//**//**//**/lJ1:endcons(lP[2],lJ1),
/**//**//**//**/lJ1:endcons(lP[2],lJ1)/*,display(lJ1)*/
/**//**/))$/*"樹形図(lJ)の構成(最終結果は最後のブロック)"*/
(n[1]:0,n[2]:1,n[3]:2,n[4]:3,n[5]:4,n[6]:5,n[7]:6,n[8]:7,n[9]:8)$
aA[1]:[n[1]];
inA(i):=([k,l],
/**/for k:i+1 thru jM do(
/*....*/srA(i),
/*....*/if mA[i,k]=2 then(
/*............*/for l:kM+1 step -1 thru srA+1 do(
/*................*/aA[l]:aA[l-1]),
/*............*//*for l:srA thru kM+1 do print("in0",srA,l,kM+1,aA[l]),*/
/*............*/srA(i),aA[srA]:append(aA[srA],[n[k]]),
/*............*/kM:kM+1,srA0:srA+1)),
/**/for k:srA0 thru kM-1 do aA[k]:aA[k+1],
/**/aA[kM]:"",
/**/kM:kM-1
/**//*,for k:1 thru kM do print(aA[k])*/);
srA(i):=([k,l],
/**/srA:0, /**/for k:kM step -1 thru 1 do(
/*....*/if last(aA[k])=n[i] then (srA:k/*,print(k)*/)
/**/)
);
for i:1 thru iM do(
/**/srA(i), while srA>0 do ( inA(i),srA(i)));
for k:1 thru kM do print(aA[k]);
lA:[];
for k:1 thru kM do(lA:endcons(aA[k],lA));
print(lA);
lB:[];
zJ()$/*"樹形図構成過程まとめ"*/
print("lB",lB)$
lC:[];
sJ()$/*"樹形図構成点まとめ"*/
print("sj->lC",lC)$
lJ:[];
mJ()$/*"樹形図の構成(最終結果は最後のブロック)"*/
print(MONDAI1)$
iM:length(lJ);for i:1 thru iM do(
print(lJ[i]))$/*"樹形図の表示(最終結果は最後のブロック)"*/
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI0:"C─F─H(◆修正部分)"$
MONDAI0:"│ │ │(◆修正部分)"$
MONDAI0:"A─D─G(◆修正部分)"$
MONDAI0:"│ │ (◆修正部分)"$
MONDAI0:"O─B (◆修正部分)"$
MONDAI:"OからHに行く最短の道順の樹形図は(◆修正部分)"$
n[1]:"O";n[2]:"A";n[3]:"B";n[4]:"C";n[5]:"D";n[6]:"F";n[7]:"G";n[8]:"H"/*(◆修正部分)" */;
mA:matrix( /*(◆修正部分)" */
/**/[1,2,2,0,0,0,0,0] /* "O(◆修正部分)" */,
/**/[0,1,0,2,2,0,0,0] /* "A(◆修正部分)" */,
/**/[0,0,1,0,2,0,0,0] /* "B(◆修正部分)" */,
/**/[0,0,0,1,0,2,0,0] /* "C(◆修正部分)" */,
/**/[0,0,0,0,1,2,2,0] /* "D(◆修正部分)" */,
/**/[0,0,0,0,0,1,0,2] /* "F(◆修正部分)" */,
/**/[0,0,0,0,0,0,1,2]) /* "G(◆修正部分)" */;
iM:7;jM:8;kM:1/*"(◆修正部分)" */;
◆コマンド番号202
●練習6
樹形図●●●●●●●●●●●●●●●●
kill(all) /* "202 並べ方は" */$
MONDAI:"106 下の問題について" $
KOUSATU:"A,B,Cを1,2,3として";
nHr(n,r):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA/*,print("lA",lA,length(lA))*/))$/*"重複を許してn個からr個の並べ方"*/
nPr():=block([iM,jM],
/**/iM:length(lA),
/**/jM:length(lA[1]),/*print(iM,jM),*/
/**/lEA:[],
/**/for i:1 thru iM do(
/**//**/p:1,
/**//**/for j:1 thru jM do(
/**//**//**/for j2:j+1 thru jM do(
/**//**//**//**/p:p*(lA[i][j]-lA[i][j2]))),/*print(p),*/
/**//**/if p#0 then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"重複したものを除外した並べ方"*/
take(n,list):=rest(list,n-length(list))$
zJ():=block(
/**/iM:length(lA),jM:length(lA[1]),
/**/bB:[],
/**/for j:1 thru jM do(
/**//**/for i:1 thru iM do(
/**//**//**/bN:take(j,lA[i]),
/**//**//**/if bB#bN then (lB:endcons(bN,lB),bB:bN) /*else(print(bB,bN))*/
/**//**//**/)))$/*"樹形図構成過程(lB)まとめ"*/
sJ():=block(
/**/iM:length(lB),
/**/nB:1,dB:[],nC:0,lCe:[],
/**/for i:1 thru iM do(
/**//**/nN:length(lB[i]),dN:take(nN-1,lB[i]),/*display(i,nB,nN,dB,dN),*/
/**//**/if nB=nN then(
/**//**//**//**/if dB=dN then(
/**//**//**//**//**//**/nC:nC+1/*,display(dB,dN,nC)*/
/**//**//**//**//**/)else(lCe:endcons(nC,lCe),dB:dN,nC:1/*,display(dB,dN,nC,lCe)*//*,display(i,nB,dB,lCe)*/)
/**//**//**/)else(lCe:endcons(nC,lCe),lC:endcons(lCe,lC)/*,display(lC,lCe)*/,nC:1,nB:nN,dB:dN,lCe:[])),
/**/lCe:endcons(nC,lCe),lC:endcons(lCe,lC))$/*"樹形図構成点(lC)まとめ"*/
mJ():=block([idB],
/**/nlC:[0],
/**/lP:[">"," ","―","├","│","└","┬"],
/**/lJ0:[lP[2]],lJe:[lP[1]],iM:length(lC),lJ1:lJ0,idB:0,
/**/for i:1 thru iM do(
/**//**/jM:length(lC[i]),/*display(lC[i]),*/
/**//**/nlC:endcons(lsum(i1,i1,lC[i]),nlC),
/**//**/for j:1 thru jM do(
/**//**//**/if i#1 then (lJe:lJ[j+lsum(ls,ls,take(i-1,nlC))]),
/**//**//**/if i#1 and j=jM then lJ0:lJ1,
/**//**//**/kM:lC[i][j],/*display(lC[i][j]),*/
/**//**//**/for k:1 thru kM do(
/**//**//**//**/if k=1 then (
/**//**//**//**//**//**/if k=kM then lJee:endcons(lP[3],lJe)else lJee:endcons(lP[7],lJe),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)elseif k=kM then(
/**//**//**//**//**//**/lJeee:[" "],lM:length(lJee),
/**//**//**//**//**//**/for l:2 step 2 thru lM -2 do(
/**//**//**//**//**//**//**/if lJee[l]=lP[7]or lJee[l]=lP[5] or lJee[l]=lP[4] then (lJeee:endcons(lP[5],lJeee),lJeee:endcons(" ",lJeee))
/**//**//**//**//**//**//**//**/else (lJeee:endcons(" ",lJeee),lJeee:endcons(" ",lJeee)) ),
/**//**//**//**//**//**/lJee:endcons(lP[6],lJeee),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)else(
/**//**//**//**//**//**/lJee:endcons(lP[4],lJ0),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/),
/**//**//**//**/lJ:endcons(lJee,lJ) /*,display(lJ)*/
/**//**//**//**/)
/**//**//**/,idB:idB+lC[i][j]
/**//**//**/),
/**//**//**//**/lJ0:endcons(lP[5],lJ0) ,
/**//**//**//**/lJ0:endcons(lP[2],lJ0),/*display(lJ0),*/
/**//**//**//**/lJ1:endcons(lP[2],lJ1),
/**//**//**//**/lJ1:endcons(lP[2],lJ1)/*,display(lJ1)*/
/**//**/))$/*"樹形図(lJ)の構成(最終結果は最後のブロック)"*/
lA:[[]];
MONDAI1:"A,B,Cをすべて1つずつ並べる並べ方は(◆修正部分)" $
nHr(4,3);/*"重複を許して3個から3個の並べ方(◆修正部分)"*/
print("lA",lA)$
nPr();/*"重複したものを除外した並べ方"*/
print("lA",lA)$
lB:[];
zJ()$/*"樹形図構成過程まとめ"*/
print("lB",lB)$
lC:[];
sJ()$/*"樹形図構成点まとめ"*/
print("sj->lC",lC)$
lJ:[];
mJ()$/*"樹形図の構成(最終結果は最後のブロック)"*/
print(MONDAI1)$
iM:length(lJ);for i:1 thru iM do(
print(lJ[i]))$/*"樹形図の表示(最終結果は最後のブロック)"*/
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"A,B,C,Dから、3つについて1つずつ並べる並べ方は(◆修正部分)" $
nHr(4,3);/*"重複を許して3個から3個の並べ方(◆修正部分)"*/
◆コマンド番号203
●例題2
樹形図●●●●●●●●●●●●●●●●
kill(all) /* "203 さいころの目の和" */$
MONDAI:"107 下の問題について" $
KOUSATU:"目の和が5以上のものを除外して、1,2,...,6の目を大中小の順に並べる";
nHr(n,r):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA/*,print("lA",lA,length(lA))*/))$/*"重複を許してn個からr個の並べ方"*/
wPr(w):=block([iM,jM],
/**/iM:length(lA),
/**/jM:length(lA[1]),/*print(iM,jM),*/
/**/lEA:[],
/**/for i:1 thru iM do(
/**//**/s:0,/*"(◆◆修正部分1)"*/
/**//**/for j:1 thru jM do(
/**//**/s:s+lA[i][j]),/*print(p),*//*"(◆◆修正部分2)"*/
/**//**/if s=w then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"目の和がwのものの並べ方"*/
take(n,list):=rest(list,n-length(list))$
zJ():=block(
/**/iM:length(lA),jM:length(lA[1]),
/**/bB:[],
/**/for j:1 thru jM do(
/**//**/for i:1 thru iM do(
/**//**//**/bN:take(j,lA[i]),
/**//**//**/if bB#bN then (lB:endcons(bN,lB),bB:bN) /*else(print(bB,bN))*/
/**//**//**/)))$/*"樹形図構成過程(lB)まとめ"*/
sJ():=block(
/**/iM:length(lB),
/**/nB:1,dB:[],nC:0,lCe:[],
/**/for i:1 thru iM do(
/**//**/nN:length(lB[i]),dN:take(nN-1,lB[i]),/*display(i,nB,nN,dB,dN),*/
/**//**/if nB=nN then(
/**//**//**//**/if dB=dN then(
/**//**//**//**//**//**/nC:nC+1/*,display(dB,dN,nC)*/
/**//**//**//**//**/)else(lCe:endcons(nC,lCe),dB:dN,nC:1/*,display(dB,dN,nC,lCe)*//*,display(i,nB,dB,lCe)*/)
/**//**//**/)else(lCe:endcons(nC,lCe),lC:endcons(lCe,lC)/*,display(lC,lCe)*/,nC:1,nB:nN,dB:dN,lCe:[])),
/**/lCe:endcons(nC,lCe),lC:endcons(lCe,lC))$/*"樹形図構成点(lC)まとめ"*/
mJ():=block([idB],
/**/nlC:[0],
/**/lP:[">"," ","―","├","│","└","┬"],
/**/lJ0:[lP[2]],lJe:[lP[1]],iM:length(lC),lJ1:lJ0,idB:0,
/**/for i:1 thru iM do(
/**//**/jM:length(lC[i]),/*display(lC[i]),*/
/**//**/nlC:endcons(lsum(i1,i1,lC[i]),nlC),
/**//**/for j:1 thru jM do(
/**//**//**/if i#1 then (lJe:lJ[j+lsum(ls,ls,take(i-1,nlC))]),
/**//**//**/if i#1 and j=jM then lJ0:lJ1,
/**//**//**/kM:lC[i][j],/*display(lC[i][j]),*/
/**//**//**/for k:1 thru kM do(
/**//**//**//**/if k=1 then (
/**//**//**//**//**//**/if k=kM then lJee:endcons(lP[3],lJe)else lJee:endcons(lP[7],lJe),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)elseif k=kM then(
/**//**//**//**//**//**/lJeee:[" "],lM:length(lJee),
/**//**//**//**//**//**/for l:2 step 2 thru lM -2 do(
/**//**//**//**//**//**//**/if lJee[l]=lP[7]or lJee[l]=lP[5] or lJee[l]=lP[4] then (lJeee:endcons(lP[5],lJeee),lJeee:endcons(" ",lJeee))
/**//**//**//**//**//**//**//**/else (lJeee:endcons(" ",lJeee),lJeee:endcons(" ",lJeee)) ),
/**//**//**//**//**//**/lJee:endcons(lP[6],lJeee),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)else(
/**//**//**//**//**//**/lJee:endcons(lP[4],lJ0),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/),
/**//**//**//**/lJ:endcons(lJee,lJ) /*,display(lJ)*/
/**//**//**//**/)
/**//**//**/,idB:idB+lC[i][j]
/**//**//**/),
/**//**//**//**/lJ0:endcons(lP[5],lJ0) ,
/**//**//**//**/lJ0:endcons(lP[2],lJ0),/*display(lJ0),*/
/**//**//**//**/lJ1:endcons(lP[2],lJ1),
/**//**//**//**/lJ1:endcons(lP[2],lJ1)/*,display(lJ1)*/
/**//**/))$/*"樹形図(lJ)の構成(最終結果は最後のブロック)"*/
lA:[[]];
MONDAI1:"A,B,Cをすべて1つずつ並べる並べ方は" $
nHr(6,3);/*"重複を許して6個から3個の並べ方"*/
print("lA",lA)$
wPr(5);/*"目の和が5のものの並べ方(◆◆修正部分3)"*/
print("lA",lA)$
lB:[];
zJ()$/*"樹形図構成過程まとめ"*/
print("lB",lB)$
lC:[];
sJ()$/*"樹形図構成点まとめ"*/
print("sj->lC",lC)$
lJ:[];
mJ()$/*"樹形図の構成(最終結果は最後のブロック)"*/
print(MONDAI1)$
iM:length(lJ);for i:1 thru iM do(
print(lJ[i]))$/*"樹形図の表示(最終結果は最後のブロック)"*/
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
/**//**/s:1,/*"(◆◆修正部分1)"*/
/**//**/s:s*lA[i][j]),/*print(p),*//*"(◆◆修正部分2)"*/
wPr(6);/*"目の積が6のものの並べ方(◆◆修正部分3)"*/
◆コマンド番号204
●応用例題2・練習8
樹形図●●●●●●●●●●●●●●●●
kill(all) /* "204 5回勝負、3回先勝の場合の数" */$
MONDAI:"108 下の問題について" $
KOUSATU:"勝ち1,負け2を5回勝負の順に並べ、3回勝つ場合から、後ろの連続負けを空白に置き換えて、";
nHr(n,r):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA/*,print("lA",lA,length(lA))*/))$/*"重複を許してn個からr個の並べ方"*/
wPr(w):=block([iM,jM],
/**/iM:length(lA),
/**/jM:length(lA[1]),/*print(iM,jM),*/
/**/lEA:[],
/**/for i:1 thru iM do(
/**//**/if lsum(mod(ls,2),ls,lA[i])=w then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"勝ち1の和がwのものの並べ方"*/
take(n,list):=rest(list,n-length(list))$
zJ():=block(
/**/iM:length(lA),jM:length(lA[1]),
/**/bB:[],
/**/for j:1 thru jM do(
/**//**/for i:1 thru iM do(
/**//**//**/bN:take(j,lA[i]),
/**//**//**/if bB#bN then (lB:endcons(bN,lB),bB:bN) /*else(print(bB,bN))*/
/**//**//**/)))$/*"樹形図構成過程(lB)まとめ"*/
sJ():=block(
/**/iM:length(lB),
/**/nB:1,dB:[],nC:0,lCe:[],
/**/for i:1 thru iM do(
/**//**/nN:length(lB[i]),dN:take(nN-1,lB[i]),/*display(i,nB,nN,dB,dN),*/
/**//**/if nB=nN then(
/**//**//**//**/if dB=dN then(
/**//**//**//**//**//**/nC:nC+1/*,display(dB,dN,nC)*/
/**//**//**//**//**/)else(lCe:endcons(nC,lCe),dB:dN,nC:1/*,display(dB,dN,nC,lCe)*//*,display(i,nB,dB,lCe)*/)
/**//**//**/)else(lCe:endcons(nC,lCe),lC:endcons(lCe,lC)/*,display(lC,lCe)*/,nC:1,nB:nN,dB:dN,lCe:[])),
/**/lCe:endcons(nC,lCe),lC:endcons(lCe,lC))$/*"樹形図構成点(lC)まとめ"*/
mJ():=block([idB],
/**/nlC:[0],
/**/lP:[">"," ","―","├","│","└","┬"],
/**/lJ0:[lP[2]],lJe:[lP[1]],iM:length(lC),lJ1:lJ0,idB:0,
/**/for i:1 thru iM do(
/**//**/jM:length(lC[i]),/*display(lC[i]),*/
/**//**/nlC:endcons(lsum(i1,i1,lC[i]),nlC),
/**//**/for j:1 thru jM do(
/**//**//**/if i#1 then (lJe:lJ[j+lsum(ls,ls,take(i-1,nlC))]),
/**//**//**/if i#1 and j=jM then lJ0:lJ1,
/**//**//**/kM:lC[i][j],/*display(lC[i][j]),*/
/**//**//**/for k:1 thru kM do(
/**//**//**//**/if k=1 then (
/**//**//**//**//**//**/if k=kM then lJee:endcons(lP[3],lJe)else lJee:endcons(lP[7],lJe),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)elseif k=kM then(
/**//**//**//**//**//**/lJeee:[" "],lM:length(lJee),
/**//**//**//**//**//**/for l:2 step 2 thru lM -2 do(
/**//**//**//**//**//**//**/if lJee[l]=lP[7]or lJee[l]=lP[5] or lJee[l]=lP[4] then (lJeee:endcons(lP[5],lJeee),lJeee:endcons(" ",lJeee))
/**//**//**//**//**//**//**//**/else (lJeee:endcons(" ",lJeee),lJeee:endcons(" ",lJeee)) ),
/**//**//**//**//**//**/lJee:endcons(lP[6],lJeee),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/)else(
/**//**//**//**//**//**/lJee:endcons(lP[4],lJ0),
/**//**//**//**//**//**/lJee:endcons(last(lB[idB+k]),lJee)
/**//**//**//**//**/),
/**//**//**//**/lJ:endcons(lJee,lJ) /*,display(lJ)*/
/**//**//**//**/)
/**//**//**/,idB:idB+lC[i][j]
/**//**//**/),
/**//**//**//**/lJ0:endcons(lP[5],lJ0) ,
/**//**//**//**/lJ0:endcons(lP[2],lJ0),/*display(lJ0),*/
/**//**//**//**/lJ1:endcons(lP[2],lJ1),
/**//**//**//**/lJ1:endcons(lP[2],lJ1)/*,display(lJ1)*/
/**//**/))$/*"樹形図(lJ)の構成(最終結果は最後のブロックの前半)"*/
dL(list):=block([lDe,cD,iM],
/**/lDe:[],cD:last(list),iM:length(list),
/**/while cD=2 do(
/**//**/lDe:cons(" ",lDe),list:take(iM-1,list),cD:last(list),iM:iM-1
/**/),print("lDe",list,lDe),
/**/olist:append(list,lDe)
/**/)$/*リストlA[i]の要素の最後の敗けを空白に*/
dPr():=block([lDe,iM],
lDe:[],iM:length(lA),print("iM",iM),
for i:1 thru iM do(
lDe:endcons(dL(lA[i]),lDe)
),
lA:lDe
/**/)$/*リストlAの要素の最後の敗けを空白に*/
lA:[[]];
MONDAI1:"5回勝負において、勝ち1,負け2で、3回勝つ場合の並べ方は(◆修正部分1)" $
nHr(2,5);/*"重複を許して2個のものを5つ並べる並べ方(◆修正部分1)"*/
print("lA",lA)$
wPr(3);/*"勝ちの和が3のものの並べ方(◆修正部分2)"*/
print("lA",lA)$
list:dPr();print("list",list)$
lB:[];
zJ()$/*"樹形図構成過程まとめ"*/
print("lB",lB)$
lC:[];
sJ()$/*"樹形図構成点まとめ"*/
print("sj->lC",lC)$
lJ:[];
mJ()$/*"樹形図の構成(最終結果は最後のブロック)"*/
print(MONDAI1)$
iM:length(lJ);for i:1 thru iM do(
print(lJ[i]))$/*"樹形図の表示(最終結果は最後のブロックの上半分)"*/
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行しても、結果は同じになる。理由を考察せよ。
MONDAI1:"コインの表(1)、裏(2)として、表が2回で賞品獲得。(◆修正部分1)" $
nHr(2,6);/*"6回投げて、表2回出れば終了とすると、賞品獲得の場合の表裏の出方は(◆修正部分1)"*/
wPr(2);/*"表の回数が2のものの並べ方(◆修正部分2)"*/
B 和の法則
◆コマンド番号205
●例題3・練習9
さいころの目の和●●●●●●●●●●●●●●●●
kill(all) /* "205 さいころの目の和" */$
nXr(n,r,sw):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*"異なるsw="N"、昇順"G"、降順"L"、重複"A"でn個からr個の並べ方"*/
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 n<=list[i] ) or (sw="L"and n>=list[i]) then D:false),V:D)$
wPr(w):=block([iM,jM],
/**/iM:length(lA),
/**/jM:length(lA[1]),/*print(iM,jM),*/
/**/lEA:[],
/**/for i:1 thru iM do(
/**//**/if lsum(ls,ls,lA[i])=w then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"目の和がwのものの並べ方"*/
MONDAI1:"2回投げるさいころの目の和が5の倍数になる出方は(◆修正部分1)" $
KOUSATU:"2回投げるさいころの目の和が5の倍数になる出方は、和が5,10の場合";
KOUSATU:"和が5となる目の出方と、10となる目の出方とに共通部分はないから、和の法則が成立";
KOUSATU:"2回投げるさいころの目の和が5となる出方は、";
KOUSATU:"1列に並べた5個のものを、4か所の間のどこで区切るか";
KOUSATU:"(・/・/・/・/・のどの/で区切るか)と同じで、";
MeW:5;/*"(◆修正部分2)"*/
w1:if 7>=MeW then MeW-1 else MeW-1-2*(MeW-1);
KAKUNIN:"目の出方で確認すると";
lA:[[]];
nXr(6,2,"A");/*"重複を許して1~6の番号を2つ並べる並べ方"*/
print("lA",lA)$
wPr(5);/*"目の和が5のものの出方(◆修正時訂正)"*/
print("lA",lA)$
KOUSATU:"2回投げるさいころの目の和が10となる出方は、";
KOUSATU:"1列に並べた10個のものを、どこで区切るか";
KOUSATU:"区切るだけなら10-1=9か所で区切れるが";
KOUSATU:"(・/・/・/・/・/・/・/・/・/・のどの/で区切るか)";
KOUSATU:"区切った大きい方は6までだから、小さい方は4以上となるので";
KOUSATU:"左右に4-1=3か所区切れない箇所があって";
KOUSATU:"(・・・・/・/・/・・・・のどの/で区切るか)と同じであり";
KOUSATU:"9か所(10-1)から3か所(4-1)の2倍を引いて";
MeW:10;/*"(◆修正部分3)"*/
w2:if 7>=MeW then MeW-1 else MeW-1-2*(MeW-6-1);
KAKUNIN:"目の出方で確認すると";
lA:[[]];
nXr(6,2,"A");/*"重複を許して1~6の番号を2つ並べる並べ方"*/
print("lA",lA)$
wPr(10);/*"目の和が10のものの出方(◆修正時訂正)"*/
print("lA",lA)$
KOTAE:[w1+w2,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"2回投げるさいころの目の和が5の倍数になる出方は(◆修正部分1)" $
MeW:7;/*"(◆修正部分2)"*/
MeW:8;/*"(◆修正部分3)"*/
C 積の法則
◆コマンド番号206
●・練習10
2つと3つのものから1つずつとる取り方●●●●●●●●●●●●●●●●
kill(all) /* "206 2種類のケーキと3種類の飲み物からそれぞれ1つずつとる取り方は" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(Nm[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"2種類のケーキと3種類の飲み物からそれぞれ1つずつとる取り方は(◆修正部分)" $
KOUSATU:"1つ目がケーキの種類、2つ目が飲み物の種類として、並べ方は(◆修正部分)";
M1:2;M2:3;/*"(◆修正部分)"*/
MeP:M1*M2;
KAKUNIN:"目の出方で確認すると";
lA:[[]];
Xr([M1,M2],"A");/*"1つ目がケーキの種類、2つ目が飲み物の種類として、並べ方は(◆◆修正時訂正)"*/
Nm:[["Sc","Cc"],["C","T","S"]]$/*"第1成分がケーキの種類、第2成分が飲み物の種類(◆◆修正時訂正)"*/
Cn(Nm)$
print("lA",lA)$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"大きいさいころの目が3以上と小さいさいころの目が偶数となる目の出方は(◆修正部分)" $
KOUSATU:"大きいさいころの目3,4,5,6を1,2,3,4とし、小さいさいころの目2,4,6を1,2,3として考える(◆修正部分)";
M1:4;M2:3;/*"(◆修正部分)"*/
◆コマンド番号207
●例題4・練習11
大・中・小3つのさいころ●●●●●●●●●●●●●●●●
kill(all) /* "207 大・中・小3つのさいころについて" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(Nm[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"大・中・小3つのさいころの目がすべて奇数である出方は(◆修正部分)" $
KOUSATU:"大の目が1,3,5のそれぞれについて、中の目が1,3,5となり・・・積の法則となる(◆修正部分)";
M1:3;M2:3;M3:3;/*"(◆修正部分)"*/
MeP:M1*M2*M3(◆◆修正時訂正)"*/
KAKUNIN:"目の出方で確認すると";
lA:[[]];
Xr([M1,M2,M3],"A");/*"1つ目が大のさいころの目、2つ目が中のさいころの目・・・として、出方は(◆◆修正時訂正)"*/
Nm:[["1","3","5"],["1","3","5"],["1","3","5"]]$/*"1つ目が大のさいころの目、2つ目が中のさいころの目・・・(◆◆修正時訂正)"*/
Cn(Nm)$
print("lA",lA)$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"積(a+b+c+d)*(x+y+z)を展開すると、項は何通りか(◆修正部分)" $
KOUSATU:"展開式の項は、第1因子のa,b,c,dの1つのそれぞれについて、第2因子のx,y,zを並べたものと考える(◆修正部分)";
M1:4;M2:3;/*"(◆修正部分)"*/
◆コマンド番号208
●応用例題3・練習12
整数の正の約数●●●●●●●●●●●●●●●●
kill(all) /* "208 整数72の正の約数は何個か" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(Nm[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
cL(list1,list2):=block([i,iM,j,jM,p,lE],iM:length(lA),jM:length(lA[1]),lE:[],
/**/for i:1 thru iM do(p:1,
/**//**/for j:1 thru jM do(p:p*list1[j]^lA[i][j]),
/**//**/lE:endcons(p,lE)),
/**/lA:lE)$
MONDAI1:"72の約数は何個か(◆修正部分)" $
KOUSATU:"素因数分解72=2^3*3^2して、第1因子2の指数0,1,2,3のそれぞれについて、第二因子3の指数0,1,2・・・積の法則となる(◆修正部分)";
M1:4;M2:3;/*"(◆修正部分)"*/
MeP:M1*M2;/*"(◆◆修正時訂正)"*/
KAKUNIN:"約数で確認すると";
lA:[[]];
Xr([M1,M2],"A");/*"1つ目が2の指数、2つ目が3の指数・・・として、その値(約数)は(◆◆修正時訂正)"*/
Nm:[[0,1,2,3],[0,1,2]]$/*"1つ目が2の指数、2つ目が3の指数・・・(◆◆修正時訂正)"*/
Cn(Nm)$
cL([2,3],Nm)$
print("lA",lA)$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"144の約数は何個か(◆修正部分)" $
KOUSATU:"素因数分解144=2^4*3^2して、第1因子2の指数0,1,2,3,4のそれぞれについて、第二因子3の指数0,1,2・・・積の法則となる(◆修正部分)";
M1:5;M2:3;/*"(◆修正部分)"*/
:
3.順列
A 順列の総数
◆コマンド番号301
●例3・練習13
順列●●●●●●●●●●●●●●●●
kill(all) /* "301 下の問題について" */$
nXr(n,r,sw):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*"異なるsw="N"、昇順"G"、降順"L"、重複"A"でn個からr個の並べ方"*/
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)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(Nm[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
take(n,list):=rest(list,n-length(list))$
zJ():=block([i,iM,j,jM,bB,bN],iM:length(lA),jM:length(lA[1]),bB:[],
/**/for j:1 thru jM do(
/**//**/for i:1 thru iM do(bN:take(j,lA[i]),
/**//**//**/if bB#bN then (lB:endcons(bN,lB),bB:bN) /*else(print(bB,bN))*/
/**//**//**/)))$/*"樹形図構成過程(lB)まとめ"*/
sJ():=block([i,iM,nB,dB,nC,lCe,nN,dN],iM:length(lB),nB:1,dB:[],nC:0,lCe:[],
/**/for i:1 thru iM do(nN:length(lB[i]),dN:take(nN-1,lB[i]),/*display(i,nB,nN,dB,dN),*/
/**//**/if nB=nN then(
/**//**//**//**/if dB=dN then(nC:nC+1/*,display(dB,dN,nC)*/
/**//**//**//**//**/)else(lCe:endcons(nC,lCe),dB:dN,nC:1/*,display(dB,dN,nC,lCe)*//*,display(i,nB,dB,lCe)*/)
/**//**//**/)else(lCe:endcons(nC,lCe),lC:endcons(lCe,lC)/*,display(lC,lCe)*/,nC:1,nB:nN,dB:dN,lCe:[])),
/**/lCe:endcons(nC,lCe),lC:endcons(lCe,lC))$/*"樹形図構成点(lC)まとめ"*/
substl(a,list,k):=block([n,l],n:length(list),l:append(append(rest(list,k-1-n),[a]),rest(list,k)))$
mJ():=block([i,iM,nlC,lP,lJ0,lJe,lJ1,idB,kM,lJee,lJeee],nlC:[0],lP:[">"," ","―","├","│","└","┬"],
/**/lJ0:[lP[2]],lJe:[lP[1]],iM:length(lC),lJ1:lJ0,idB:0,lCb:1,
/**/for i:1 thru iM do(jM:length(lC[i]),nlC:endcons(lsum(i1,i1,lC[i]),nlC),
/**//**/for j:1 thru jM do(
/**//**//**/if i#1 then (lJe:lJ[j+lsum(ls,ls,take(i-1,nlC))]),
/**//**//**/if i#1 and j=jM then lJ0:lJ1,
/**//**//**/kM:lC[i][j],/*display(lC[i][j]),*/
/**//**//**/for k:1 thru kM do(
/**//**//**//**/if i=1 then(
/**//**//**//**//**//**/if k=1 then(
/**//**//**//**//**//**//**//**/lJee9:[lP[1],lP[7],last(lB[idB+k])])
/**//**//**//**//**//**//**/elseif k=kM then(
/**//**//**//**//**//**//**//**/lJee9:[lP[2],lP[6],last(lB[idB+k])])
/**//**//**//**//**//**//**/else lJee9:[lP[2],lP[4],last(lB[idB+k])]
/**//**//**//**//**//**//*,display([lJee,lJee9])*/ )
/**//**//**//**//**/else(
/**//**//**//**//**//**/if k=1 and k#kM then(
/**//**//**//**//**//**//**//**/lJee9:append(lJ[lCb],[lP[7],last(lB[idB+k])]),lJee8:lJee9)
/**//**//**//**//**//**//**/elseif k=1 and k=kM then(
/**//**//**//**//**//**//**//**/lJee9:append(lJ[lCb],[lP[3],last(lB[idB+k])]),lJee8:lJee9)
/**//**//**//**//**//**//**/else(
/**//**//**//**//**//**//**//**/lJee9:lJ[lCb],
/**//**//**//**//**//**//**//**/for k2:1 thru length(lJ[lCb]) do(
/**//**//**//**//**//**//**//**//**/if lJee9[k2]=lP[4] or lJee9[k2]=lP[5] or lJee9[k2]=lP[7] then(
/**//**//**//**//**//**//**//**//**//**//**/lJee9:substl("│",lJee9,k2)/*,print(k2,lJee9)*/)
/**//**//**//**//**//**//**//**//**//**/else (lJee9:substl(lP[2],lJee9,k2)/*,print(k2,k2,lJee9)*/)),
/**//**//**//**//**//**//**//**/if k#kM then(/*kokokara*/
/**//**//**//**//**//**//**//**//**//**/lJee9:append(lJee9,[lP[4],last(lB[idB+k])]))
/**//**//**//**//**//**//**//**//**/else lJee9:append(lJee9,[lP[6],last(lB[idB+k])]))
/**//**//**//**//**//**//*,display([lJee,lJee9])*/),/*kokomade*/
/**//**//**//**/if i#1 and k=kM then lCb:lCb+1,
/**//**//**//**/lJ:endcons(lJee9,lJ) /**/),
/**//**//**/idB:idB+lC[i][j]),
/**//**/lJ0:endcons(lP[5],lJ0),lJ0:endcons(lP[2],lJ0),/*display(lJ0),*/
/**//**/lJ1:endcons(lP[2],lJ1),lJ1:endcons(lP[2],lJ1)/*,display(lJ1)*/))$/*"樹形図(lJ)の構成(最終結果は最後のブロックの前半)"*/
MONDAI1:"a,b,c,dのうち、異なる3個を取って1列に並べる、並べ方の総数は(◆修正部分)" $
KOUSATU:"1つ目は4通り、それぞれの場合について2つ目は1つ目を除き3通り・・・となり、(◆修正部分)";
KOUSATU:"積の法則が成立して、(◆修正部分)";
M1:4;M2:3;M3:2;/*"(◆修正部分)"*/
MeP:M1*M2*M3;/*"(◆◆修正時訂正)"*/
KAKUNIN:"樹形図で確認すると";
lA:[[]];
nXr(4,3,"N");/*"重複を許さず("N"),1~4の番号を3つ並べる並べ方(◆◆修正時訂正)"*/
print("lA",lA)$
Nm:[["a","b","c","d"],["a","b","c","d"],["a","b","c","d"]]$/*"第1-3成分がa,b,c,d(◆◆修正時訂正)"*/
Cn(Nm)$/*"番号をa,b,c,dに変換"*/
print("lA",lA)$
lB:[];
zJ()$/*"樹形図構成過程まとめ"*/
print("lB",lB)$
lC:[];
sJ()$/*"樹形図構成点まとめ"*/
print("lB->lC",lC)$
lJ:[];
mJ()$/*"樹形図の構成(最終結果は最後のブロック)"*/
print(MONDAI1)$
iM:length(lJ);for i:1 thru iM do(
print(lJ[i]))$/*"樹形図の表示(最終結果は最後のブロック)"*/
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"a,b,c,dのうち、異なる4個を取って1列に並べる、並べ方の総数は(◆修正部分)" $
KOUSATU:"1つ目は4通り、それぞれの場合について2つ目は1つ目を除き3通り・・・となり、(◆修正部分)";
KOUSATU:"積の法則が成立して、(◆修正部分)";
M1:4;M2:3;M3:2;M4:1;/*"(◆修正部分)"*/
◆コマンド番号302
●例3・練習13・練習14
順列の総数●●●●●●●●●●●●●●●●
kill(all) /* "302 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nXr(n,r,sw):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*"異なるsw="N"、昇順"G"、降順"L"、重複"A"でn個からr個の並べ方"*/
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)$
MONDAI1:"7人から3人を選んで1列に並べる並び順は(◆修正部分)" $
KOUSATU:"1つ目は7通り、そのそれぞれについて、2つ目は、1つ目の人を除いた6通り・・・積の法則で7P3(◆修正部分)";
n:7;r:3;/*"(◆修正部分)"*/
MeP:nPr(n,r);
KAKUNIN:"並べ方でで確認すると";
lA:[[]];
nXr(n,r,"N");/*"7つの数を3つ並べ、同じ数が並ばないとして、その並べ方、個数"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"1~6の数字のうちの異なる4つを並べてできる4桁の整数は何個か(◆修正部分)" $
KOUSATU:"1つ目は6通り、そのそれぞれについて、2つ目は、1つ目の数を除いた5通り・・・積の法則で6P4(◆修正部分)";
n:6;r:4;/*"(◆修正部分)"*/
◆コマンド番号303
●例4・練習15
順列の総数●●●●●●●●●●●●●●●●
kill(all) /* "303 下の問題について" */$
nXr(n,r,sw):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*"異なるsw="N"、昇順"G"、降順"L"、重複"A"でn個からr個の並べ方"*/
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)$
MONDAI1:"4人の生徒全員を1列に並べる並び順は(◆修正部分)" $
KOUSATU:"1つ目は4通り、そのそれぞれについて、2つ目は、1つ目の人を除いた6通り・・・積の法則で4!=4P4(◆修正部分)";
n:4;r:4;/*"(◆修正部分)"*/
MeP:n!;
KAKUNIN:"並べ方でで確認すると";
lA:[[]];
nXr(n,r,"N");/*"7つの数を3つ並べ、同じ数が並ばないとして、その並べ方、個数(最後のブロック)"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"7個の文字A,B,C,D,E,F,Gすべてを1列に並べる並び順は(◆修正部分)" $
KOUSATU:"Aを1、Bを2、・・・として、7!=7P7(◆修正部分)";
n:7;r:7;/*"(◆修正部分)"*/
B 順列の考え方の応用
◆コマンド番号304
●例題5・練習16・練習17
順列の考え方と場合の数●●●●●●●●●●●●●●●●
kill(all) /* "304 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nXr(n,r,sw):=block([i,j],/*print("nHr",lA,length(lA[1]),r),*/
/**/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("lL",lL),*/
/**//**//**/for j:1 thru n do(
/**//**//**//**/if lng(j,lL,sw)=true then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),/*print("lEA",lEA),*/
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*"異なるsw="N"、昇順"G"、降順"L"、重複"A"でn個からr個の並べ方"*/
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)$
MONDAI1:"1~10の10枚のカードを1枚ずつ3人の生徒a,b,cに配るとき、配り方は何通りか(◆修正部分)" $
KOUSATU:"aには10通り、そのそれぞれについて、bには、1つ目のカードを除いた9通り・・・積の法則で10P3(◆修正部分)";
n:10;r:3;/*"(◆修正部分)"*/
MeP:nPr(n,r);
KAKUNIN:"並べ方でで確認すると";
lA:[[]];
nXr(n,r,"N");/*"10個の数を3つ並べ、同じ数が並ばないとして、その並べ方、個数(最後のブロック)"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"4つの場所を、異なる5色で塗り分ける塗り方は何通りか(◆修正部分)" $
KOUSATU:"第1の場所をある色1で5通り、そのそれぞれについて第2の場所を色1以外の色2で4通り、・・・として、5P4(◆修正部分)";
n:5;r:4;/*"(◆修正部分)"*/
◆コマンド番号305
●応用例題4・練習19
順列の考え方と場合の数●●●●●●●●●●●●●●●●
kill(all) /* "305 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
clA(list):=block([i,iM,j,jM,lE,lEe],iM:length(lA),jM:length(list),lE:[],print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(lEe:endcons(lA[i][list[j]],lEe)),print(lEe),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"男子4人と女子3人が1列に並ぶとき、両端が男子の並び方は何通りか(◆修正部分)" $
KOUSATU:"両端の並び方は4P2通り、そのそれぞれについて、(◆修正部分)";
KOUSATU:"両端以外は両端の2人を除いた5人の並び方で5!・・・積の法則により・・・(◆修正部分)";
d:4;j:3;/*"(◆修正部分)"*/
MeP:nPr(d,2)*(d-2+j)!;/*"(◆修正部分)"*/
KAKUNIN:"並べ方でで確認すると";
lA:[[]];
Xr([d,d,d+j,d+j,d+j,d+j,d+j],"N");/*"ひとまず、1つ目が男、2つ目が男、3~7つ目以降男と女として、並べて、(◆修正部分2)"*/
clA([1,3,4,5,6,7,2]);/*"その後、1->1,3->2,4->3,5->4,6->5,2->7と並べ替えて、(◆◆修正時削除)"*/
Nm:[["d1","d2","d3","d4","j1","j2","j3"],["d1","d2","d3","d4","j1","j2","j3"],["d1","d2","d3","d4","j1","j2","j3"],["d1","d2","d3","d4","j1","j2","j3"],["d1","d2","d3","d4","j1","j2","j3"],["d1","d2","d3","d4","j1","j2","j3"],["d1","d2","d3","d4","j1","j2","j3"]]$/*"全成分で、["d1","d2","d3","d4","j1","j2","j3"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"4個の数字0,1,2,3を1個ずつ使って、3桁の数字をつくる作り方は何通りか(◆修正部分)" $
KOUSATU:"先頭は0以外の3通り、そのそれぞれについて、(◆修正部分)";
KOUSATU:"2,3桁目は先頭以外の3通りで・・・積の法則により・・・(◆修正部分)";
KOUSATU:"1,2,3,4で並べて、4を0に変えると、(◆修正部分)";
d:4;/*"(◆修正部分)"*/
MeP:(d-1)*nPr(d-1,2)/*"(◆修正部分)"*/
Xr([d-1,d,d],"N");/*"ひとまず、1桁目が1,2,3、2,3桁目が1,2,3,4として、並べて、(◆修正部分2)"*/
Nm:[["1","2","3","0"],["1","2","3","0"],["1","2","3","0"]]$/*"全成分で、["1","2","3","0"]と表記を変えて(◆修正部分2)"*/
◆コマンド番号306
●応用例題4・練習18
順列の考え方と場合の数●●●●●●●●●●●●●●●●
kill(all) /* "306 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
clA(D,J):=block([i,iM,j,jM,lE,lEe],iM:length(lA),jM:D+1,lE:[],print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(
/**//**//**/if lA[i][j]=D+1 then lEe:append(lEe,rest(lA[i],D+1)) else lEe:endcons(lA[i][j],lEe)),print(lEe),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"男子4人と女子3人が1列に並ぶとき、女子3人が並ぶ並び方は何通りか(◆修正部分)" $
KOUSATU:"女子3人を一人分と見なして5P5=5!通り、そのそれぞれについて、(◆修正部分)";
KOUSATU:"1人分と見なしたところに女子3人を並べる並べ方で3!・・・積の法則により・・・(◆修正部分)";
d:4;j:3;/*"(◆修正部分)"*/
MeP:nPr(d+1,d+1)*(j)!;/*"(◆修正部分)"*/
KAKUNIN:"並べ方でで確認すると";
lA:[[]];
lXr:append(makelist(d+1,d+1),makelist(d+1+j,j));
Xr(lXr,"N");/*"ひとまず、1~5つ目が5人、6~8つ目が8人(現実には6,7,8しか並ばない)として、並べて、"*/
clA(d,j);/*"その後、5のところに6~8を並べ替えて、"*/
Nm:makelist(["d1","d2","d3","d4","j0","j1","j2","j3"],d+1+j)$/*"全成分で、["d1","d2","d3","d4","j1","j2","j3"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"5個の母音a,i,u,e,oと3個の子音k,s,tを1列に並べるとき母音5つが連続して並ぶ並び方は何通りか(◆修正部分)" $
KOUSATU:"母音5個を一個分と見なして4P4=4!通り、そのそれぞれについて、(◆修正部分)";
KOUSATU:"一個分と見なしたところに母音5個を並べる並べ方で5!・・・積の法則により・・・(◆修正部分)";
d:3;j:5;/*"(◆修正部分)"*/
MeP:(d+1)!*j!;/*"(◆修正部分)"*/
Nm:makelist(["k","s","t","B0","a","i","u","e","o"],d+1+j)$/*"全成分で、["k","s","t","B0","a","i","u","e","o"]と表記を変えて(◆修正部分2)"*/
C 円順列
◆コマンド番号307
●例5・練習20
円順列の総数●●●●●●●●●●●●●●●●
kill(all) /* "307 下の問題について" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
MONDAI1:"7人で輪をつくるとき、並ぶ順は何通りか(◆修正部分)" $
KOUSATU:"輪を作るときは、回転して同じ位置関係になるものは同じものと考えるから、(◆修正部分)";
KOUSATU:"円順列と呼ばれて、ある1人の位置を固定し、他の6人の並び方を考えると、・・・(◆修正部分)";
d:7;/*"(◆修正部分)"*/
MeP:(d-1)!;/*"(◆修正部分)"*/
KAKUNIN:"並べ方で確認すると";
lA:[[]];
lXr:append(makelist(1,1),makelist(d,d-1));
Xr(lXr,"N");/*"ひとまず、1つ目が1人、2~7つ目が7人(現実には2~7しか並ばない)として、並べて、"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"異なる6個の玉を円形に並べる並び方は何通りか(◆修正部分)" $
KOUSATU:"円形に並べるのは、円順列だから、(◆修正部分)";
KOUSATU:"ある1個の位置を固定し、他の5個の並び方を考えると、・・・(◆修正部分)";
d:6;/*"(◆修正部分)"*/
MeP:(d-1)!;/*"(◆修正部分)"*/
◆コマンド番号308
●応用例題5・練習21
円順列の総数●●●●●●●●●●●●●●●●
kill(all) /* "308 下の問題について" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
clA(list):=block([i,iM,j,jM,lE,lEe],iM:length(lA),jM:length(list),lE:[],print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(lEe:endcons(lA[i][list[j]],lEe)),print(lEe),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"男子4人、女子4人が輪の形に並ぶとき、男女が交互に並ぶ並び方は何通りか(◆修正部分)" $
KOUSATU:"1~4を男、5~8を女として、円順列で男子4人を並べ、そのそれぞれについて、(◆修正部分)";
KOUSATU:"男子の間に女子4人を並べる並び方を考えると、・・・(◆修正部分)";
d:4;j:4;/*"(◆修正部分)"*/
MeP:(d-1)!*j!;/*"()"*/
KAKUNIN:"並べ方で確認すると";
lA:[[]];
lXr:append(append(makelist(1,1),makelist(d,d-1)),makelist(d+j,j));/*"ひとまず、1つ目が1、2~4つ目が4人(現実には2~4しか並ばない)、5~8つ目が8人(現実には5~8しか並ばない)として、並べて、"*/
Xr(lXr,"N");
print("lA",lA,length(lA))$
clA([1,5,2,6,3,7,4,8]);/*"その後、1->1,5->2,2->3,6->4,3->5,7->6,4->7,8->8と並べ替えて、(◆修正部分2)"*/
Nm:makelist(["d1","d2","d3","d4","j1","j2","j3","j4"],d+j)$/*"全成分で、["d1","d2","d3","d4","j1","j2","j3","j4"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"大人5人、子ども5人が輪の形に並ぶとき、大人と子ども交互に並ぶ並び方は何通りか(◆修正部分)" $
KOUSATU:"1~5を大人、6~10を子どもとして、円順列で大人5人を並べ、そのそれぞれについて、(◆修正部分)";
KOUSATU:"大人の間に子ども5人を並べる並び方を考えると、・・・(◆修正部分)";
d:5;j:5;/*"(◆修正部分)"*/
clA([1,6,2,7,3,8,4,9,5,10]);/*"その後、1->1,6->2,2->3,7->4,3->5,8->6,4->7,9->8,5->9,10->10と並べ替えて、(◆修正部分2)"*/
Nm:makelist(["o1","o2","o3","o4","o5","k1","k2","k3","k4","k5"],d+j)$/*"全成分で、["o1","o2","o3","o4","o5","k1","k2","k3","k4","k5"]と表記を変えて(◆修正部分2)"*/
◆コマンド番号309
●練習22
円順列の総数●●●●●●●●●●●●●●●●
kill(all) /* "309 下の問題について" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
clA(D,J):=block([i,iM,j,jM,lE,lEe],iM:length(lA),jM:D+1,lE:[],print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(
/**//**//**/if lA[i][j]=D+1 then lEe:append(lEe,rest(lA[i],D+1)) else lEe:endcons(lA[i][j],lEe)),print(lEe),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"男子4人、女子2人が輪の形に並ぶとき、女子が隣り合う並び方は何通りか(◆修正部分)" $
KOUSATU:"女子2人を一つ分と考えて、1~4を男子、5を一つ分の女子、6~7を女子として、円順列で1~5の5人を並べ、(◆修正部分)";
KOUSATU:"5の位置に女子2人を並べる並び方を考えると、・・・(◆修正部分)";
d:4;j:2;/*"(◆修正部分)"*/
MeP:(d+1-1)!*j!;/*"()"*/
KAKUNIN:"並べ方で確認すると";
lA:[[]];
lXr:append(append(makelist(1,1),makelist(d+1,d+1-1)),makelist(d+1+j,j));/*"ひとまず、1つ目が1、2~5つ目が5人(現実には2~5しか並ばない)、6~7つ目が7人(現実には6~7しか並ばない)として、並べて、"*/
Xr(lXr,"N");
print("lA",lA,length(lA))$
clA(d,j);/*"その後、d+1のところに最後のj個を並べ替えて、"*/
Nm:makelist(["d1","d2","d3","d4","j0","j1","j2"],d+j)$/*"全成分で、["d1","d2","d3","d4","j1","j2","j3","j4"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"男子3人、女子3人が輪の形に並ぶとき、女子が隣り合う並び方は何通りか(◆修正部分)" $
KOUSATU:"女子3人を一つ分と考えて、1~3を男子、4を一つ分の女子、5~7を女子として、円順列で1~4の4人を並べ、(◆修正部分)";
KOUSATU:"4の位置に女子3人を並べる並び方を考えると、・・・(◆修正部分)";
d:3;j:3;/*"(◆修正部分)"*/
Nm:makelist(["d1","d2","d3","j0","j1","j2","j3"],d+j)$/*"全成分で、["d1","d2","d3","j0","j1","j2","j3"]と表記を変えて(◆修正部分2)"*/
D 重複順列
◆コマンド番号310
●例題5・練習23
重複順列の総数●●●●●●●●●●●●●●●●
kill(all) /* "310 下の問題について" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
clA(D,J):=block([i,iM,j,jM,lE,lEe],iM:length(lA),jM:D+1,lE:[],print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(
/**//**//**/if lA[i][j]=D+1 then lEe:append(lEe,rest(lA[i],D+1)) else lEe:endcons(lA[i][j],lEe)),print(lEe),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"数字1,2,3を重複を許して並べて、4桁の整数を作るとき、できる整数は何個か(◆修正部分)" $
KOUSATU:"4桁目は1,2,3の3通り、そのそれぞれについて3桁目も3通り・・・(◆修正部分)";
KOUSATU:"積の法則によって、・・・(◆修正部分)";
d:3;nd:4;/*"(◆修正部分)"*/
MeP:d^nd;/*"()"*/
KAKUNIN:"並べ方で確認すると";
lA:[[]];
lXr:makelist(d,nd);/*"1~ndつ目を1,2,3のdつとして、並べて、"*/
Xr(lXr,"A");/*"重複を許すので"A""*/
Nm:makelist(["1","2","3"],nd)$/*"全成分で、["1","2","3"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"4種類の文字a,b,c,dを重複を許して3個並べる並び方は何通りか(◆修正部分)" $
KOUSATU:"1つ目はa,b,c,dの4通り、そのそれぞれについて2つ目も4通り・・・(◆修正部分)";
KOUSATU:"積の法則によって、・・・(◆修正部分)";
d:4;nd:3;/*"(◆修正部分)"*/
Nm:makelist(["a","b","c","d"],nd)$/*"全成分で、["a","b","c","d"]と表記を変えて(◆修正部分2)"*/
研究
◆コマンド番号311
●研究
立方体の色塗り●●●●●●●●●●●●●●●●
kill(all) /* "311 下の問題について" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
nDr(k1,k2):=block([i,iM,lEA],iM:length(lA),lEA:[],
/**/for i:1 thru iM do(
/**//**/if lA[i][k2]=nlA(lA[i][k1]) then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"第k1成分から指定される第k2成分をもつリストのみを残す。"*/
nlA(n):=block([v],if n=2 then v:3 else v:2)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"立方体の6面を赤青黄白緑黒6色で塗分けるとき、塗り方は何通りか(◆修正部分)" $
KOUSATU:"赤1,青2,黄3,白4,緑5,黒6とし、下の面は1とすると、上の面は2~6の5通り・・・(◆修正部分)";
KOUSATU:"そのそれぞれについて、側面は上下の色以外の4色の円順列だから、積の法則によって、・・・(◆修正部分)";
d:6;/*"(◆修正部分)"*/
MeP:(d-1)*(d-2-1)!;/*"()"*/
KAKUNIN:"並べ方で確認すると";
lA:[[]];
lXr:append([1],makelist(d,d-1));/*"1つ目を1,2-dつ目をdとして、並べて、"*/
Xr(lXr,"N");/*"重複を許さないのでN"*/
nDr(2,3);
print("lA",lA,length(lA))$
Nm:makelist(["赤","青","黄","白","緑","黒"],d)$/*"全成分で、["赤","青","黄","白","緑","黒"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"正八面体の8面を赤青黄白茶水緑黒8色で塗分けるとき、塗り方は何通りか(◆修正部分)" $
KOUSATU:"赤1,青2,黄3,白4,茶5,水6,緑7,黒8とし、下の面は1とすると、上の面は2~8の7通り・・・(◆修正部分)";
KOUSATU:"そのそれぞれについて、側面は上下の色以外の6色の円順列だから、積の法則によって、・・・(◆修正部分)";
d:8;/*"(◆修正部分)"*/
Nm:makelist(["赤","青","黄","白","茶","水","緑","黒"],d)$/*"全成分で、["赤","青","黄","白","茶","水","緑","黒"]と表記を変えて(◆修正部分2)"*/
:
4.組合せ
A 組合せの総数
◆コマンド番号401
●例6・練習24・練習25
組合せの総数●●●●●●●●●●●●●●●●
kill(all) /* "401 下の問題について" */$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
nDr(k1,k2):=block([i,iM,lEA],iM:length(lA),lEA:[],
/**/for i:1 thru iM do(
/**//**/if lA[i][k2]=nlA(lA[i][k1]) then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"第k1成分から指定される第k2成分をもつリストのみを残す。"*/
nlA(n):=block([v],if n=2 then v:3 else v:2)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"5人から3人を選ぶとき、選び方の総数は何通りか(◆修正部分)" $
KOUSATU:"5人から3人を選ぶ選び方を5C3として、そのそれぞれについて3人を並べたとき(並べ方3!)・・・(◆修正部分)";
KOUSATU:"それは、5人から3人を選んで並べる並べ方5P3で、一方、それは積の法則により、5C3*3!・・・(◆修正部分)";
n:5;r:3;/*"(◆修正部分)"*/
MeP:n!/(n-r)!/r!;/*"()"*/
KAKUNIN:"並べ方で確認すると(同じ並び方の代表を小さい順に並べたものと考えて)";
lA:[[]];
lXr:makelist(n,r);/*"1-r個目をdとして、並べて、"*/
Xr(lXr,"G");/*"小さい順なので”G”"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"9色から4色を選ぶとき、選び方の総数は何通りか(◆修正部分)" $
KOUSATU:"9色から4色を選ぶ選び方を9C4として、そのそれぞれについて4色を並べたとき(並べ方4!)・・・(◆修正部分)";
KOUSATU:"それは、9色から4色を選んで並べる並べ方9P4で、一方、それは積の法則により、9C4*4!・・・(◆修正部分)";
n:9;r:4;/*"(◆修正部分)"*/
B nCrの性質
◆コマンド番号402
●例7・練習26
組合せの総数●●●●●●●●●●●●●●●●
kill(all) /* "402 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"10個から7個を選ぶとき、選び方の総数は、10個から3個を選ぶときの選び方の総数と等しいか(◆修正部分)" $
KOUSATU:"10個から7個を選び出すのは、残す3個を選ぶのと同じ・・・(◆修正部分)";
KOUSATU:"10C7は10C3で計算できる。(◆修正部分)";
n:10;r:7;/*"(◆修正部分)"*/
MeP:[nCr(n,r),nCr(n,n-r)];/*"()"*/
KAKUNIN:"並べ方で確認すると(同じ並び方の代表を小さい順に並べたものと考えて)";
lA:[[]];
lXr:makelist(n,r);/*"1~r個目をnとして、並べて、"*/
Xr(lXr,"G");/*"小さい順なので”G”"*/
print("lA",lA,length(lA))$
lA:[[]];
lXr:makelist(n,n-r);/*"1~n-r個目をnとして、並べて、"*/
Xr(lXr,"L");/*"大きい順なので”L”"*/
Nm:makelist(makelist(n+1-I,I,1,n),n)$/*"全成分で、[n,n-1,n-2,...,1]と表記を変えて"*/
Cn(Nm)$
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"8個から6個を選ぶとき、選び方の総数は、8個から2個を選ぶときの選び方の総数と等しいか(◆修正部分)" $
KOUSATU:"8個から6個を選び出すのは、残す2個を選ぶのと同じ・・・(◆修正部分)";
KOUSATU:"8C6は8C2で計算できる。(◆修正部分)";
n:8;r:6;/*"(◆修正部分)"*/
C 組合せの考え方の利用
◆コマンド番号403
●例題7・練習27
組合せの考え方の応用●●●●●●●●●●●●●●●●
kill(all) /* "403 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"正八角形の8個の頂点のうち3点を結んで三角形を作るとき、できる三角形は何個か(◆修正部分)" $
KOUSATU:"頂点8個から3個を選ぶと、1つの三角形ができる・・・(◆修正部分)";
KOUSATU:"できる三角形は8C3個。(◆修正部分)";
n:8;r:3;/*"(◆修正部分)"*/
MeP:nCr(n,r);/*"()"*/
KAKUNIN:"選んだ3点で確認すると(同じ並び方の代表を小さい順に並べたものと考えて)";
lA:[[]];
lXr:makelist(n,r);/*"1~r個目をnとして、並べて、"*/
Xr(lXr,"G");/*"小さい順なので”G”"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"正六角形について、対角線の本数は何本か(◆修正部分)" $
KOUSATU:"頂点6個から2個を選び出すと、対角線1本ができる。・・・(◆修正部分)";
KOUSATU:"6C2で計算できる。(◆修正部分)";
n:6;r:2;/*"(◆修正部分)"*/
◆コマンド番号404
●例題8・練習28
組合せの考え方の応用●●●●●●●●●●●●●●●●
kill(all) /* "404 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"5人の男子から2人、4人の女子から2人を選んで、4人の組を作るとき、できる組は、何通か(◆修正部分)" $
KOUSATU:"5人から2人を選ぶのは5C2、その一通りについて4人から2人を選ぶから・・・(◆修正部分)";
KOUSATU:"積の法則によって・・・(◆修正部分)";
d:5;dr:2;j:4;jr:2;/*"(◆修正部分)"*/
MeP:nCr(d,dr)*nCr(j,jr);/*"()"*/
KAKUNIN:"組を作って確認すると(同じ並び方の代表を小さい順に並べたものと考えて)";
lA:[[]];
lXr:append(makelist(d,dr),makelist(d+j,jr));/*"男子1~5、女子6から9として、1~dr個目をd、dr+1~dr+jrをd+jとして、並べて、"*/
lXr:[[1,5],[1,5],[6,9],[6,9]];
Xr(lXr,"G");/*"小さい順なので”G”"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"7人の男子から3人、6人の女子から3人を選んで、6人の組を作るとき、できる組は、何通か(◆修正部分)" $
KOUSATU:"7人から3人を選ぶのは7C3、その一通りについて6人から3人を選ぶから・・・(◆修正部分)";
KOUSATU:"積の法則によって・・・(◆修正部分)";
d:7;dr:3;j:6;jr:3;/*"(◆修正部分)"*/
D 組分けの総数
◆コマンド番号405
●応用例題6・練習29
組分けの総数●●●●●●●●●●●●●●●●
kill(all) /* "405 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
nDr(k1,k2):=block([i,iM,lEA],iM:length(lA),lEA:[],
/**/for i:1 thru iM do(
/**//**/if lA[i][k2]>lA[i][k1] then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"第k2成分が第k1成分より大きいものをもつリストのみを残す。"*/
MONDAI1:"6人をA,B,Cの3部屋に2人ずつ分ける分け方は、何通か。単に2人ずつに分ける分け方は、何通か(◆修正部分)" $
KOUSATU:"A部屋に6人から2人を選ぶのは6C2、その一通りについてB部屋に4人から2人を選ぶから・・・(◆修正部分)";
KOUSATU:"積の法則によって・・・(◆修正部分)";
KOUSATU:"部屋3つの区別3!通りを1つに見なすときは、区別する場合を3!で割ると・・・(◆修正部分)";
d:6;dr:2;/*"(◆修正部分)"*/
MeP:[nCr(d,dr)*nCr(d-dr,dr),nCr(d,dr)*nCr(d-dr,dr)/3!];/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると(第1,2要素がA部屋、第3,4要素がB部屋、第5,6要素がC部屋と考えて)";
lA:[[]];
lXr:makelist([1,d],d);/*"第1,2要素がA部屋、第3,4要素がB部屋、第5,6要素がC部屋と考えて、並べて、"*/
Xr(lXr,"N");/*"重複を許さないで”N”"*/
for i:1 step 2 thru d do(nDr(i,i+1));/*"第i+1成分が第i成分より大きい(iは奇数)ものをもつリストのみを残す。"*/
print("lA",lA,length(lA))$
for i:1 step 2 thru d-2 do(nDr(i,i+2));/*"第i+2成分が第i成分より大きい(iは奇数)ものをもつリストのみを残す。"*/
print("lA",lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"8人をA,B,C,Dの3部屋に2人ずつ分ける分け方は、何通か。単に2人ずつに分ける分け方は、何通か(◆修正部分)" $
KOUSATU:"A部屋に8人から2人を選ぶのは8C2、その一通りについてB部屋に6人から2人を選ぶから・・・(◆修正部分)";
KOUSATU:"積の法則によって・・・(◆修正部分)";
KOUSATU:"部屋4つの区別4!通りを1つに見なすときは、区別する場合を4!で割ると・・・(◆修正部分)";
d:8;dr:2;/*"(◆修正部分)"*/
MeP:[nCr(d,dr)*nCr(d-dr,dr)*nCr(d-2*dr,dr),nCr(d,dr)*nCr(d-dr,dr)*nCr(d-2*dr,dr)/4!];/*"(◆修正部分)"*/
E 同じものを含む順列
◆コマンド番号406
●例題9・練習30
同じものを含む順列●●●●●●●●●●●●●●●●
kill(all) /* "406 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(
/**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do(
/**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
nDr():=block([i,iM,j,lEA],iM:length(lA),lEA:[lA[1]],
/**/for i:2 thru iM do(vp:true,
/**//**/for j:1 thru i-1 do(if lA[i]=lA[j] then vp:false),if vp=true then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"第k1成分から指定される第k2成分をもつリストのみを残す。"*/
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"7個の数字1,1,1,2,2,3,3を使ってできる7桁の数は、何通か(◆修正部分)" $
KOUSATU:"7つの場所(1~7)の順列を考えて、最初の場所1~3を1に、次の場所4,5を2に・・・として(◆修正部分)";
KOUSATU:"最初の3つ場所(1~3)の順列分は1つに見なし、次の2つの場所(4,5)の順列分も1つに・・・(◆修正部分)";
d1:3;d2:2;d3:2;/*"(◆修正部分)"*/
MeP:(d1+d2+d3)!/(d1!*d2!*d3!);/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると";
lA:[[]];
lXr:makelist([1,d1+d2+d3],d1+d2+d3);/*"d1+d2+d3の要素すべて、1~d1+d2+d3と考えて、並べて、"*/
Xr(lXr,"N");/*"重複を許さないで”N”"*/
clA([d1,d1+d2,d1+d2+d3],[1,2,3]);/*"初めのd1個の場所を1に、次のd2個を2に、最後のd3個を3に入れ替える、"*/
nDr()$/*"異なる組のみを残す。"*/
Nm:makelist(["1","2","3"],d1+d2+d3)$/*"全成分で、["1","2","3"]と表記を変えて(◆修正部分2)"*/
Cn(Nm)$
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"BANANAの文字をすべて使って文字列を作るとき、作れる文字列は何個か(◆修正部分)" $
KOUSATU:"6つの場所(1~6)の順列を考えて、最初の3つ(1~3)をAに、次の2つ(4,5)をNに・・・として(◆修正部分)";
KOUSATU:"最初の3つ場所(1~3)の順列分は1つに見なし、次の2つの場所(4,5)の順列分も1つに・・・(◆修正部分)";
d1:3;d2:2;d3:1;/*"(◆修正部分)"*/
MeP:(d1+d2+d3)!/(d1!*d2!*d3!);/*"(◆修正部分)"*/
Nm:makelist(["A","N","B"],d1+d2+d3)$/*"全成分で、["A","N","B"]と表記を変えて(◆修正部分2)"*/
E 同じものを含む順列
◆コマンド番号407
●応用例題7・練習31
同じものを含む順列●●●●●●●●●●●●●●●●
kill(all) /* "407 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do(
/**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do(
/**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
nDr():=block([i,iM,j,lEA],iM:length(lA),lEA:[lA[1]],
/**/for i:2 thru iM do(vp:true,
/**//**/for j:1 thru i-1 do(if lA[i]=lA[j] then vp:false),if vp=true then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"第k1成分から指定される第k2成分をもつリストのみを残す。"*/
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"長方形の道路の内側に、縦の辺に平行な3つの縦道路と横の辺に平行な2つの横道路があり、(◆修正部分)" $
MONDAI1:"左下から右上に、遠回りせずに行く道順は何通りか(◆修正部分)" $
KOUSATU:"3個の↑と4個の→の重複順列と考えて(◆修正部分)";
d1:3;d2:4;/*"(◆修正部分)"*/
MeP:(d1+d2)!/(d1!*d2!);/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると";
lA:[[]];
lXr:makelist([1,d1+d2],d1+d2);/*"d1+d2の要素すべて、1~d1+d2と考えて、並べて、(◆修正部分2)"*/
Xr(lXr,"N");/*"重複を許さないで”N”"*/
clA([d1,d1+d2],[1,2]);/*"初めのd1個の場所を1に、次のd2個を2に、最後のd3個を3に入れ替える、(◆修正部分3)"*/
nDr()$/*"異なる組のみを残す。"*/
Nm:makelist(["↑","→"],d1+d2)$/*"全成分で、["↑","→"]と表記を変えて(◆修正部分4)"*/
Cn(Nm)$
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"長方形の道路の内側に、縦の辺に平行な4つの縦道路と横の辺に平行な2つの横道路があり、(◆修正部分)" $
MONDAI1:"左下から右上に、2つ右・1つ上の地点を通り、遠回りせずに行く道順は何通りか(◆修正部分)" $
KOUSATU:"左下から、2つ右・1つ上の地点へ行く道順のそれぞれについて、2つ右・1つ上の地点から右上へ行く道順と考えて(◆修正部分)";
d1:1;d2:2;d3:2;d4:3;/*"(◆修正部分)"*/
MeP:(d1+d2)!/(d1!*d2!)*(d3+d4)!/(d3!*d4!);/*"(◆修正部分)"*/
lXr:append(makelist([1,d1+d2],d1+d2),makelist([d1+d2+1,d1+d2+d3+d4],d3+d4));/*"d1+d2の要素すべて、1~d1+d2と考えて、並べて、(◆修正部分2)"*/
clA([d1,d1+d2,d1+d2+d3,d1+d2+d3+d4],[1,2,1,2]);/*"初めのd1個の場所を1に、次のd2個を2に、最後のd3個を3に入れ替える、(◆修正部分3)"*/
Nm:makelist(["↑","→"],d1+d2+d3+d4)$/*"全成分で、["↑","→"]と表記を変えて(◆修正部分4)"*/
研究 重複を許して作る組合せ
◆コマンド番号408
●研究
重複を許して作る組合せ●●●●●●●●●●●●●●●●
kill(all) /* "408 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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="g" and list[i]>n ) or (sw="L"and n>=list[i]) or (sw="l"and n>list[i]) then D:false),V:D)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do( /**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do( /**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
nDr():=block([i,iM,j,lEA],iM:length(lA),lEA:[lA[1]],
/**/for i:2 thru iM do(vp:true,
/**//**/for j:1 thru i-1 do(if lA[i]=lA[j] then vp:false),if vp=true then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"第k1成分から指定される第k2成分をもつリストのみを残す。"*/
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"3種類の果物リンゴ、ナシ、ミカンから、重複を許して、(◆修正部分)" $
MONDAI1:"4個選んでつくる組合せは何通りか(◆修正部分)" $
KOUSATU:"果物の4個の○と区切りの2個の!を並べる重複順列と考え、(◆修正部分)";
KOUSATU:"最初の区切りまでをリンゴ、次の区切りまでをナシ、その後をミカンとすると(◆修正部分)";
KOUSATU:"したがって、6個のものから、区切りとする2個を選ぶ組合せと考え、・・・(◆修正部分)";
n:3;r:4;/*"(◆修正部分)"*/
MeP:(n+r-1)!/(n-1);/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると";
lA:[[]];
lXr:makelist([1,n],r);/*"rの要素すべて、1~nと考えて、並べて、(◆修正部分2)"*/
Xr(lXr,"g");/*"元来の問題は重複を許す組合せだから、小さい順に並べる”G”"*/
Nm:makelist(["リ","ナ","ミ"],r)$/*"全成分で、["リ","ナ","ミ"]と表記を変えて(◆修正部分4)"*/
Cn(Nm)$
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"3種類の果物リンゴ、ナシ、ミカンから、重複を許して、(◆修正部分)" $
MONDAI1:"5個選んでつくる組合せは何通りか(◆修正部分)" $
KOUSATU:"果物の5個の○と区切りの2個の!を並べる重複順列と考え、(◆修正部分)";
KOUSATU:"最初の区切りまでをリンゴ、次の区切りまでをナシ、その後をミカンとすると(◆修正部分)";
KOUSATU:"したがって、7個のものから、区切りとする2個を選ぶ組合せと考え、・・・(◆修正部分)";
n:3;r:5;/*"(◆修正部分)"*/
:
101.補充問題
補充問題
◆コマンド番号10101
●補充問題
重複を許して作る準列●●●●●●●●●●●●●●●●
kill(all) /* "10101 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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="g" and list[i]>n )
/**//**//**/or (sw="L"and n>=list[i]) or (sw="l"and n>list[i]) then D:false),V:D)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do( /**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do( /**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
KOKONI:"◆ここに修正部分2を挿入"$
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"大中小3個のさいころを投げるとき、(◆修正部分)" $
MONDAI1:"すべて異なる目が出る場合は、何通りか(◆修正部分)" $
KOUSATU:"1~6の6個の数字を、重複を許して1列に並べたときの、(◆修正部分)";
KOUSATU:"最初を大の目、次を中の目、最後を小の目と考えると(◆修正部分)";
n:6;r:3;/*"(◆修正部分)"*/
MeP:n^r;/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると";
lA:[[]];
lXr:makelist([1,n],r);/*"rの要素すべて、1~nと考えて、並べて、"*/
Xr(lXr,"A");/*"重複を許す順列だから、”A”"*/
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"大中小3個のさいころを投げるとき、(◆修正部分)" $
MONDAI1:"目の積が奇数になる場合は、何通りか(◆修正部分)" $
KOUSATU:"3個の目が全て奇数のときに限られるから、1,3,5の3個の数字を、重複を許して1列に並べたときの、(◆修正部分)";
KOUSATU:"最初を大の目、次を中の目、最後を小の目と考えると(◆修正部分)";
n:3;r:3;/*"(◆修正部分)"*/
MeP:n^r;/*"(◆修正部分)"*/
nDr():=block([i,iM,j,lEA],iM:length(lA),lEA:[lA[1]],/*"(◆修正部分2)"*/
/**/for i:1 thru iM do(vp:1,/*"(◆修正部分2)"*/
/**//**/for j:1 thru length lA[i] do(vp:vp*lA[i][j]),if mod(vp,2)=1 then lEA:endcons(lA[i],lEA)),/*"(◆修正部分2)"*/
/**/lA:lEA)$/*"全ての要素の積が奇数となるリストのみを残す。(◆修正部分2)"*/
◆コマンド番号10102
●補充問題
重複を許して作る準列●●●●●●●●●●●●●●●●
kill(all) /* "10102 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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="g" and list[i]>n ) or (sw="L"and n>=list[i]) or (sw="l"and n>list[i]) then D:false),V:D)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do( /**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do( /**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"7人の男子と5人の女子から3人の委員を選ぶとき、(◆修正部分)" $
MONDAI1:"男子が2人以上選ばれる場合は、何通りか(◆修正部分)" $
KOUSATU:"1~7を男子、8~12を女子として、(◆修正部分)";
KOUSATU:"7人から3人を選ぶ場合と、7人から2人を選び5人から1人を選ぶ場合との和の法則を考えて(◆修正部分)";
d:7;j:5;r:3;/*"(◆修正部分)"*/
MeP:nCr(d,r)+nCr(d,2)*nCr(j,r-2);/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると";
lA:[[]];
lXr:[[1,d],[1,d],[1,d+j]];/*"2つは、1~d、1つは1~d+jと考えて、並べて、(◆修正部分2)"*/
Xr(lXr,"G");/*"重複を許さず、組合せだから昇順にして、”G”"*/
Nm:makelist(["d1","d2","d3","d4","d5","d6","d7","j1","j2","j3","j4","j5"],r)$/*"全成分で、["d1","d2","d3","d4","d5","d6","d7","j1","j2","j3","j4","j5"]と表記を変えて"*/
Cn(Nm)$
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"7人の男子と5人の女子から3人の委員を選ぶとき、(◆修正部分)" $
MONDAI1:"少なくとも男子が1人は選ばれる場合は、何通りか(◆修正部分)" $
KOUSATU:"1~7を男子、8~12を女子として、(◆修正部分)";
KOUSATU:"全体12人から3人を選ぶ場合から、女子5人から3人を選ぶ場合を引くと考えて、(◆修正部分)";
d:7;j:5;r:3;/*"(◆修正部分)"*/
MeP:nCr(d+j,3)-nCr(j,r);/*"(◆修正部分)"*/
lXr:[[1,d],[1,d+j],[1,d+j]];/*"1つは、1~d、2つは1~d+jと考えて、並べて、(◆修正部分2)"*/
◆コマンド番号10103
●補充問題
重複を許して作る準列●●●●●●●●●●●●●●●●
kill(all) /* "10103 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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="g" and list[i]>n ) or (sw="L"and n>=list[i]) or (sw="l"and n>list[i]) then D:false),V:D)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do( /**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do( /**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
Cn(list):=block([i,iM,j,jM,lN,lNe,r],iM:length(lA),lN:[],jM:length(lA[1]),
/**/for i:1 thru iM do(lNe:[],r:length(lNe),
/**//**/while jM>r do(lNe:endcons(list[r+1][lA[i][r+1]],lNe),r:length(lNe)),
/**//**/lN:endcons(lNe,lN)),
/**/lA:lN)$
MONDAI1:"4本の平行線とそれらに交わる3本の平行線があるとき、(◆修正部分)" $
MONDAI1:"これらの平行線から作られる平行四辺形は、何個か(◆修正部分)" $
KOUSATU:"1~4を最初の平行線、5~7をそれらに交わる平行線として、(◆修正部分)";
KOUSATU:"4本から2本を選び、そのそれぞれについて、3本から2本を選ぶという積の法則を考えて(◆修正部分)";
d:4;j:3;r:2;/*"(◆修正部分)"*/
MeP:nCr(d,r)*nCr(j,r);/*"(◆修正部分)"*/
KAKUNIN:"組を作って確認すると";
lA:[[]];
lXr:[[1,d],[1,d],[d+1,d+j],[d+1,d+j]];/*"2つは、1~d、後2つはd+1~d+jと考えて、並べて、(◆修正部分2)"*/
Xr(lXr,"G");/*"重複を許さず、組合せだから昇順にして、”G”"*/
Nm:makelist(["d1","d2","d3","d4","j1","j2","j3"],r+r)$/*"全成分で、["d1","d2","d3","d4","j1","j2","j3"]と表記を変えて(◆修正部分3)"*/
Cn(Nm)$
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"3本の平行線とそれらに交わる2本の平行線、さらにそれらに交わる2本の平行線があるとき、(◆修正部分)" $
MONDAI1:"これらの平行線から作られる三角形は、何個か(◆修正部分)" $
KOUSATU:"1~3を最初の平行線、4・5をそれらに交わる平行線、6・7をさらにそれらに交わる平行線として、(◆修正部分)";
KOUSATU:"3本から1本を選び、そのそれぞれについて、2本から1本を選び、さらにそのそれぞれについて、2本から1本を選ぶという積の法則を考えて(◆修正部分)";
d:3;j:2;k:2;r:1;/*"(◆修正部分)"*/
MeP:nCr(d,r)*nCr(j,r)*nCr(k,r);/*"(◆修正部分)"*/
lXr:[[1,d],[d+1,d+j],[d+j+1,d+j+k]];/*"1つは、1~d、次の1つはd+1~d+j、その次の1つは、d+j+1~d+j+kと考えて、並べて、(◆修正部分2)"*/
Nm:makelist(["d1","d2","d3","j1","j2","k1","k2"],r+r+r)$/*"全成分で、["d1","d2","d3","j1","j2","k1","k2"]と表記を変えて(◆修正部分3)"*/
◆コマンド番号10104
●補充問題
重複を許して作る準列●●●●●●●●●●●●●●●●
kill(all) /* "10104 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
XGr(list,list2,list3):=block([r,i,j,sw,sw2,sw3],sw:last(list),sw2:last(list2),sw3:last(list3),/*print("nHr",lA,length(lA[1]),r),*/
/**/r:length(list)-1,r2:length(list2)-1,
/**/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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] do(/*print(iM,length(lA[iM])+1 ),*/
/**//**//**//**/if lng(j,lL,sw)=true and lng2(j,lL,list2,sw2)and lng3(j,lL,list3,sw3) then lEA:endcons(endcons(j,lL),lEA)/*,print("lEA0",lL,lEA)*/)),
/**//**/lA:lEA,print("lA",lA,length(lA))))$/*1324>>...sw="N",1234>>sw="G",4321>>sw="L",1122>>sw="A"*/
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="g" and list[i]>n ) or (sw="L"and n>=list[i]) or (sw="l"and n>list[i]) then D:false),V:D)$
lng2(n,list,list2,sw2):=block([D,i,im,iM,j,jM,V],D:true,iM:length(list),jM:length(list2)-1,
/**/for j:1 thru jM do(if list2[j][2]>=iM+1 and iM+1>=list2[j][1] then im:list2[j][1]),
/**/for i:im thru iM do(if (sw2="N"and n=list[i]) or (sw2="G" and list[i]>=n ) or (sw2="g" and list[i]>n ) or (sw2="L"and n>=list[i]) or (sw2="l"and n>list[i]) then D:false),V:D)$
lng3(n,list,list2,sw2):=block([D,i,im,iM,j,jM,V],D:true,iM:length(list),jM:length(list2)-1,
/**/for j:1 thru jM do(if (sw2="G" and list2[j][2]=iM+1 and list[list2[j][1]]>=n) or(sw2="N" and list2[j][2]=iM+1 and list[list2[j][1]]=n) then D:false),V:D)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do( /**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do( /**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
MONDAI1:"8人を、3人部屋A,B、2人部屋Cに分けるとき、分け方は何通りか(◆修正部分)" $
KOUSATU:"8人からA部屋の3人を選んで、それぞれについて残りの5人からB部屋の3人を選んで、残りはC部屋として(◆修正部分)";
KOUSATU:"積の法則によって・・・(◆修正部分)";
n:8;r1:3;r2:3;r3:n-r1-r2;/*"(◆修正部分)"*/
MeP:nCr(n,r1)*nCr(n-r1,r2);/*"(◆修正部分)"*/
KAKUNIN:"組を作って、最初の3人をA、次の3人をB、残りの2人をCとして確認すると(◆修正部分)";
lA:[[]];
lXGr:append(makelist([1,n],n),["N"]);/*"リスト[[1,n],...,[1,n],"N"]"*/
lXGi:[[1,r1],[r1+1,r1+r2],[r1+r2+1,r1+r2+r3],"G"];/*"要素群内は昇順"*/
lXGo:[[1,r1+1],"N"];/*"要素1,r1+1は異なる”N”(◆修正部分2)"*/
XGr(lXGr,lXGi,lXGo);/*"各要素は異なり"N"、要素群内は昇順"G"にして、”G”"*/
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"8人を、3人、3人、2人に分けるとき、分け方は何通りか(◆修正部分)" $
KOUSATU:"2つの3人グループを区別すると、8人から3人を選んで、それぞれについて残りの5人から3人を選んで、残り2人なる。(◆修正部分)";
KOUSATU:"2つの3人グループを区別しないときは、区別する時の1/2!となるので・・・(◆修正部分)";
n:8;r1:3;r2:3;r3:n-r1-r2;/*"(◆修正部分)"*/
MeP:nCr(n,r1)*nCr(n-r1,r2)/2!;/*"(◆修正部分)"*/
KAKUNIN:"組を作って、最初の3人、次の3人が入れ替わったものを区別しないので、(◆修正部分)";
KAKUNIN:"それぞれ小さい順に並べて、それぞれの1人目は、最初の方が小さい番号とすると・・・(◆修正部分)";
lXGo:[[1,r1+1],"G"];/*"要素1,r1+1は小さい順”G”(◆修正部分2)"*/
◆コマンド番号10105
●コラム
完全順列●●●●●●●●●●●●●●●●
kill(all) /* "10105 下の問題について" */$
nPr(n,r):=block([i,p,P],p:1,
/**/for i:n step -1 thru n-r+1 do(p:p*i),P:p
/**/)$
nCr(n,r):=nPr(n,r)/r!$
CP(n):=if n#1 then n!-sum(nCr(n,k)*CP(n-k),k,1,n) else 0;
clA(l1,l2):=block([i,iM,j,jM,k,lE,lEe,lEee],iM:length(lA),jM:length(lA[1]),lE:[],array(lEee,jM),print(iM,jM),
/**/for i:1 thru iM do(lEe:[],
/**//**/for j:1 thru jM do( /**//**//**/lEee[j]:fclA(l1,l2,lA[i][j])),
/**//**/for j:1 thru jM do( /**//**//**/lEe:endcons(lEee[j],lEe)),
/**//**/lE:endcons(lEe,lE)),
/**/lA:lE)$
fclA(l1,l2,n):=block([V,i,iM],iM:length(l1),V:1,for i:1 thru iM do(if n>l1[i] then V:V+1),V:l2[V])$/*"nはlAの要素の成分"*/
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],k:length(lA[iM])+1,
/**//**//**/for j:sN(list,k)[1] thru sN(list,k)[2] 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))))$
/**//**//**//*1324>>...sw="N",1234>>sw="G",1134>>sw="g",4321>>sw="L",4431>>sw="l",1332>>sw="A"*/
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="g" and list[i]>n )
/**//**//**/or (sw="L"and n>=list[i]) or (sw="l"and n>list[i]) then D:false),V:D)$
sN(list,id):=block([V],if listp(list[1])=false then V:[1,list[id]]else V:[list[id][1],list[id][2]])$
nPDr():=block([i,iM,j,jM,lEA],iM:length(lA),jM:length(lA[1]),lEA:[],
/**/for i:1 thru iM do(vp:true,
/**//**/for j:1 thru jM do(if j=lA[i][j] then vp:false),if vp=true then lEA:endcons(lA[i],lEA)),
/**/lA:lEA)$/*"札の番号と並べた順番がすべて異なるリストのみを残す。"*/
MONDAI1:"1~5の封筒に1~5の番号札を1枚ずつ入れる。封筒の番号と札の番号がすべて異なる場合は、何通りか(◆修正部分)" $
KOUSATU:"n枚の場合CP(n)とする。番号札を順に並べ、並べた順に1~5の封筒に入れるとして、";
KOUSATU:"1つだけ同じ場合は、nC1*CP(n-1)、2つだけ同じ場合は、nC2*CP(n-2)、・・・nCn*CP(0)となり、これらとCP(n)を合わせるとn!となるので、・・・";
KOUSATU:"ただし、CP(0)=1,CP(1)=0とする。";
n:5;/*"(◆修正部分2)"*/
MeP:CP(n);/*"完全順列の場合の数"*/
KAKUNIN:"組を作って、確認すると";
lA:[[]];
lXr:makelist(n,n);
Xr(lXr,"N");/*"要素が異なるリストにするので”N”"*/
nPDr();/*"札の番号と並べた順番がすべて異なるリストのみを残す。"*/
print(lA,length(lA))$
KOTAE:[MeP,"答え"]$
print(MONDAI1)$
print(KOTAE)$
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI1:"1~6の封筒に1~6の番号札を1枚ずつ入れる。封筒の番号と札の番号がすべて異なる場合は、何通りか(◆修正部分)" $
n:6;/*"(◆修正部分2)"*/