Re:教えてください(こちらに新しいスレ) 山中和義 2007/01/07 10:56:52 ├Re:これも、走らせてみて下さい。SECONDさん... 山中和義 2007/01/07 11:06:39 ├問題(3)の補足 山中和義 2007/01/09 11:49:10 ├問題(1)のまとめ 山中和義 2007/01/09 11:51:05 │└みなさんたくさんの書き込みありがとうござ... 門倉 2007/01/11 16:18:25 └問題(4)のまとめ 山中和義 2007/01/16 20:15:59
Re:教えてください(こちらに新しいスレ) 山中和義 2007/01/07 10:56:52 ツリーへ
Re:教えてください(こちらに新しいスレ) |
返事を書く |
山中和義 2007/01/07 10:56:52 | |
発言数を越しましたので、こちらに新しく立ち上げます。
|
├Re:これも、走らせてみて下さい。SECONDさん... 山中和義 2007/01/07 11:06:39 ツリーへ
Re: Re:教えてください(こちらに新しいスレ) |
返事を書く |
山中和義 2007/01/07 11:06:39 | |
Re:これも、走らせてみて下さい。 SECONDさん
組み合わせの処理ですね。 順列的な処理だと時間がかかります。改良できます。ありがとうございます。 追伸 脳トレのつもりで挑戦してみましたが、 他の問題を含めて、数学的、プログラミング的にワクワクする課題です。 出題者さん、お年玉ありがとうございます。 |
├問題(3)の補足 山中和義 2007/01/09 11:49:10 ツリーへ
Re: Re:教えてください(こちらに新しいスレ) |
返事を書く |
山中和義 2007/01/09 11:49:10 | |
問題(3)の補足
素因数分解で考える。 2^a * 3^b * 5^c * 7^d * 11^e * 13^f * 17^g * 19^h * 23^i * 29^j * 31^k * 37^l * 41^m * 43^n * 47^o 10=2*5なので、 2の倍数の、素因数2の総数(Σa)は47個。 5の倍数の、素因数5の総数(Σc)は12個。 末尾の0の数は小さい方。 1から50までの数は、まず全部で50個。2の倍数の数は25個。5の倍数の数は10個。 末尾が0にならないようにするには、 2を乗じない場合の数、50-25=25 と 5を乗じない場合の数、50-10=40 の大きい方。 プログラムでの検証は、2の倍数の数と5の倍数を求めて、素因数分解してみる。 !倍数の数 LET A=50 !1から50まで PRINT "1 〜";A;"の中で" PRINT "2の倍数は数は";INT(A/2);"個" PRINT "5の倍数は数は";INT(A/5);"個" PRINT "10の倍数は数は";INT(A/10);"個" PRINT "2の倍数で10の倍数でない数は";INT(A/2)-INT(A/10);"個" PRINT "5の倍数で10の倍数でない数は";INT(A/5)-INT(A/10);"個" END !素因数分解 LET A=50 !1から50まで PRINT "2 〜";A;"の数を素因数分解すると" DIM s(20) FOR i=2 TO A CALL FACTOR(i,C,s) !素因数分解 PRINT i;"="; FOR k=1 TO C-1 !列挙する PRINT s(k);"*"; NEXT k PRINT s(c) NEXT i END !素因数分解する ! 変数 N: 素因数分解する数値。※1以上 ! 変数 K: 個数 ! 配列 A(i): 素因数 EXTERNAL SUB FACTOR(N,K,A()) LET NN=N LET K=0 LET m=2 DO WHILE NN<>1 !1まで繰り返す DO WHILE MOD(NN,m)=0 !mで割り切れるなら(mは因数) LET NN=NN/m !割り切れるまで(mのべき乗の形) LET K=K+1 LET A(K)=m !素因数とする LOOP IF m>2 THEN !2,3,5,7,9,・・・で調べる LET m=m+2 ELSE LET m=m+1 END IF LOOP END SUB |
├問題(1)のまとめ 山中和義 2007/01/09 11:51:05 ツリーへ
Re: Re:教えてください(こちらに新しいスレ) |
返事を書く |
山中和義 2007/01/09 11:51:05 | |
問題(1)のまとめ
相加・相乗平均の関係式から n√(x1*x2*…*xn)<=Σxi/n=A/n したがって、x1*x2*…*xn<=(A/n)^n 求める値は(A/n)^nを最大にするnを選べばよい。 y=(A/x)^xとして、xで微分してこの関数の増加・減少を検討するとx=A/eで最大になる。 すなわち、A/e等分したときである。eは自然対数。 また、その最大値は(A/n)^nにn=A/eを代入して、e^(A/e)である。 この場合、x1,x2,…,xnは整数だから、eに近い整数3の多い、均等な数の組み合わせであろう。 プログラムでの検証は、上記の関数y=(A/x)^xのグラフを描き、 !関数y=(A/x)^xのグラフ LET Amax=10 SET WINDOW -1,Amax+1,-1,EXP(Amax/EXP(1))+1 DRAW grid FOR A=1 TO Amax LET n=A/EXP(1) !A/e等分 LET m=EXP(n) !最大値(A/n)^n PRINT "等分 最大値" PRINT n;m;"<--- 理論値" FOR i=0 TO A STEP 0.1 !i等分 WHEN EXCEPTION IN PLOT LINES: i,(A/i)^i; PRINT i;(A/i)^i USE END WHEN NEXT i PLOT TEXT ,AT i,0:"A="&STR$(A) NEXT A END 数の組み合わせを「場合の数」で求めてみる。 DECLARE EXTERNAL SUB a.init, a.div DECLARE EXTERNAL FUNCTION a.MaxValue FOR A=1 TO 20 !ひもの長さ PRINT A;"の場合" CALL init CALL div(A,1,1) !左手でひもの片方を持つ PRINT " 最大値は";MaxValue NEXT A END MODULE a SHARE NUMERIC cnt !出力回数 LET cnt=0 SHARE NUMERIC mx !最大値 LET mx=0 SHARE NUMERIC stk(0 TO 100) !順に切り落としたひもの長さ ※最大100 PUBLIC SUB init !初期化 EXTERNAL SUB init LET stk(0)=0 !番兵 LET cnt=0 !0にする LET mx=0 END SUB PUBLIC FUNCTION MaxValue !最大値を得る EXTERNAL FUNCTION MaxValue LET MaxValue=mx END FUNCTION !変数iはスタックポインタおよび数式を表示するTAB位置 PUBLIC SUB div EXTERNAL SUB div(A,seki,i) !全長Aを長さpとA-pに2分割する LET m=seki*A !積を求める IF m>=mx THEN LET mx=m !最大値を記録する END IF LET cnt=cnt+1 PRINT USING "#######:":cnt; PRINT TAB(10);"積";m; FOR s=1 TO i-1 !切り落としたひもの長さを順に表示する ※昇順 PRINT TAB(6*s+15);stk(s);"+"; NEXT s PRINT TAB(6*i+15);A !左手に持ったひもの長さを表示する IF A>1 THEN !右手にはさみを持って、切る位置を考える FOR p=1 TO INT(A/2) !半分まで ※組み合わせ LET stk(i)=p !切り落としたひもの長さp IF p>=stk(i-1) THEN !以前切った長さ以上なら ※組み合わせ CALL div(A-p,seki*p,i+1) !左手に残ったひもを順に切っていく END IF NEXT p END IF END SUB END MODULE なお、前出の各プログラムは試行、プログラムをつくる過程です。 |
│└みなさんたくさんの書き込みありがとうござ... 門倉 2007/01/11 16:18:25 ツリーへ
Re: 問題(1)のまとめ |
返事を書く |
門倉 2007/01/11 16:18:25 | |
みなさんたくさんの書き込みありがとうございます。レポートは何とかできました。みなさんのおかげでやりきる子田はできましたがあってるかどうかはわからないです・・・・
それにしてもBASICって難しいですね。いまだに自分のプログラムがあっているかも分からないですし・・・とても悔しいです!本当にもうしわけないですがこのプログラムの正解例を書き込んでくれませんか?みなさんとてもきれいに書いてくれているのですが自分の力不足で読み砕くことが出来ません。どうかよろしくお願いします。 |
└問題(4)のまとめ 山中和義 2007/01/16 20:15:59 ツリーへ
Re: Re:教えてください(こちらに新しいスレ) |
返事を書く |
山中和義 2007/01/16 20:15:59 | |
問題(4)のまとめ
X軸にn、Y軸にXnのグラフを描く。 折れ線を使って、XnからXn+1への推移を視覚化する。 !ロジスティック写像 LET A=1.9 !(0,4] <----- LET n=20 !第n項まで SET bitmap SIZE 801,401 !画面を横長にする SET WINDOW -1,n+1,-0.1,1.1 !座標を設定する DRAW grid(1,0.1) !座標を描く SET LINE COLOR 4 !収束する場合の値を描く PLOT LINES: 0,(A-1)/A; n+1,(A-1)/A !特性程式x=A*x*(1-x)の解 (A-1)/A PLOT LINES: 0,0; n+1,0 !解 0 SET LINE COLOR 1 !元に戻す PLOT TEXT ,AT 0,1: "Xn" !軸 PLOT TEXT ,AT n-1,0: "n" PLOT TEXT ,AT n/2,1: "A="&STR$(A) ! !LET x1=0.9 !初項 (0,1) <----- FOR x0=0 TO 1 STEP 0.1 LET x1=x0 SET LINE COLOR x0*10+1 PLOT LINES: 0,x1; FOR k=1 TO n !第k項を描画する LET x=x1 LET x1=A*x*(1-x) !漸化式 Xn+1=A*Xn*(1-Xn) PLOT LINES: k,x1; NEXT k PLOT LINES NEXT x0 END |