新しく発言する EXIT インデックスへ
Re:教えてください(こちらに新しいスレ)

  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);"個"
PRINT
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 "等分 最大値"
PRINT n;m;"<--- 理論値"
PRINT

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
PRINT
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


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。