新しく発言する EXIT インデックスへ
教えてください

  教えてください 門倉 2007/01/02 13:40:49 
  (1)〜(3)は,解決のすべてをプログラ... 白石 和夫 2007/01/02 16:26:50 
  │├プログラム作成でいまくいかないところが出... 白石 和夫 2007/01/02 16:37:47 
  │└「1から50までのすべての整数をかけあわせる... 白石 和夫 2007/01/02 16:56:32 
  │ └お答えありがとうございます。 門倉 2007/01/02 22:33:11 
  │  ├十進1000桁モードか有理数モードで 白石 和夫 2007/01/03 07:36:16 
  │  ├(2)の問題、 SECOND 2007/01/03 14:31:10 
  │  │└「(少なくとも2人が)同じ」のは、「すべ... 山中和義 2007/01/03 16:16:09 
  │  │ └ありがとうございます。 SECOND 2007/01/03 17:28:03 
  │  │  ├やっぱり、ダメだ。P2がおかしい。 SECOND 2007/01/03 17:46:56 
  │  │  └こう書けば、どうか? SECOND 2007/01/03 18:09:32 
  │  │   ├!数値で確かめる。 SECOND 2007/01/03 22:37:50 
  │  │   └!(2)の問題。での順列関数は、十進BASICに... SECOND 2007/01/06 19:13:02 
  │  ├!(4)の問題、この式には不思議が、いっぱ... SECOND 2007/01/04 06:30:54 
  │  ├!(1)の問題、20については、意外な結果が... SECOND 2007/01/06 02:49:42 
  │  │└分割単位を整数に限定しないで,任意の実数... 白石 和夫 2007/01/06 08:23:18 
  │  │ ├整数に限定すれば、正解は「1を含まずに、3... 荒田浩二 2007/01/06 10:20:50 
  │  │ └!個数も、実数ですか?10を、3.68個の2.717... SECOND 2007/01/06 14:17:56 
  │  └!(3)の問題 SECOND 2007/01/06 19:01:39 
  問題1への試行 山中和義 2007/01/03 08:48:45 
  │├プログラムを変形してみよう。 山中和義 2007/01/05 22:30:30 
  ││└再帰呼び出しで簡潔だが、場合の数は多いの... 山中和義 2007/01/06 15:26:50 
  ││ └SECONDさんと同じ手法で、、、 山中和義 2007/01/06 20:13:54 
  ││  └!これも、走らせてみて下さい。 SECOND 2007/01/07 02:14:59 
  │└数学的アプローチ相加・相乗平均、ラグラン... 山中和義 2007/01/07 10:42:40 
  問題2への試行 山中和義 2007/01/03 11:16:17 
  │└すべてを列挙して求める式を予測する。 山中和義 2007/01/06 22:39:17 
  問題3への試行 山中和義 2007/01/03 13:33:27 
  ヒント 荒田浩二 2007/01/03 19:01:34 
  問題4への試行 山中和義 2007/01/05 15:08:52 

  教えてください 門倉 2007/01/02 13:40:49  ツリーへ

教えてください
門倉 2007/01/02 13:40:49
1)整数を1個または2個以上の整数の和に分けて、得られた整数の積を最大に知ることを考えます。
 たとえば、10について10=1+9とすると積は9です。10=2+3+5とすると積は30です。
 10について最大の積はいくつになるでしょうか

 20について最大の積はいくつになるでしょうか


(2)n人の集団の中に、同じ月日に生まれた人のいる確率をPnとする。ただし、2月29日生まれの人はいないものとする。
 P5を計算せよ
 また、P20を計算する方法を考え、実行せよ。

(3)1から50までの整数の中から異なるいくつかを選んで、かけあわせて一の位が0にならないようにします。選ぶことができる整数は、最も多くて?個です。また、1から50までのすべての整数をかけあわせると、末尾に0が?個並びます。

(4)数列{Xn}が次の漸化式で定義されている。
        0=<X0=<1
        Xn+1=AXn(1-Xn)
1. 0<α<1のときのlim Xnの値を求めよ
2. 1<α<2のときのlim Xnの値を求めよ

という問題を十進BASICで解けというのですか、本当にできるのですか?できたら解き方も教えてください。お願いします。

  (1)〜(3)は,解決のすべてをプログラ... 白石 和夫 2007/01/02 16:26:50  ツリーへ

Re: 教えてください
白石 和夫 2007/01/02 16:26:50
(1)〜(3)は,解決のすべてをプログラムに委ねるのではなくて,何を計算すべきかは人間が考えて,その計算のみをBASICで行うことを意図した問題だと思います。
(4)は,頭で考えるだけで結論が得られます。もし収束すれば,その極限は,xに関する2次方程式x=a*x*(1-x)の解です。
収束する様子を調べるのに,計算を利用することを意図したものでしょう。A(α?)とx0を入力すると,100項目までを順に出力するようなプログラムを作って試行錯誤してみてください。十進BASICのサンプルプログラムに類似の問題が含まれていますが,それらは,Aの値が2より大きい場合(この場合がむずかしい)が対象です。

  │├プログラム作成でいまくいかないところが出... 白石 和夫 2007/01/02 16:37:47  ツリーへ

Re: (1)〜(3)は,解決のすべてをプログラ...
白石 和夫 2007/01/02 16:37:47
プログラム作成でいまくいかないところが出てきたら,プログラムを貼り付けて聞いてください。

  │└「1から50までのすべての整数をかけあわせる... 白石 和夫 2007/01/02 16:56:32  ツリーへ

Re: (1)〜(3)は,解決のすべてをプログラ...
白石 和夫 2007/01/02 16:56:32
「1から50までのすべての整数をかけあわせると、末尾に0が?個並びます」という問題は,普通にコンピュータで計算すると,正しい答えがでない問題です。(十進BASICだと,有理数モードで正解が得られる)

  │ └お答えありがとうございます。 門倉 2007/01/02 22:33:11  ツリーへ

Re: 「1から50までのすべての整数をかけあわせる...
門倉 2007/01/02 22:33:11
お答えありがとうございます。
考えてみましたが、できませんでした。
参考に正解例を教えてくれませんか。
お願いします。

  │  ├十進1000桁モードか有理数モードで 白石 和夫 2007/01/03 07:36:16  ツリーへ

Re: お答えありがとうございます。
白石 和夫 2007/01/03 07:36:16
十進1000桁モードか有理数モードで

10 PRINT 1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29*30*31*32*33*34*35*36*37*38*39*40*41*42*43*44*45*46*47*48*49*50
20 END

を実行すると,
30414093201713378043612608166064768844377641568960512000000000000

になります。あとは人力で0の個数を数えれば,
「1から50までのすべての整数をかけあわせると、末尾に0が?個並びます」という問題の答えが12だと分かります。
コンピュータを試行錯誤の道具として使ってもよいので,その理由を考えてみようというのが,出題意図だと思います。

  │  ├(2)の問題、 SECOND 2007/01/03 14:31:10  ツリーへ

Re: お答えありがとうございます。
SECOND 2007/01/03 14:31:10
(2)の問題 、
n人の集団の中に、同じ月日に生まれた人のいる確率をPnとする。ただし、2月29日生まれの人はいないものとする。
 P5を計算せよ
 また、P20を計算する方法を考え、実行せよ。

1人目は、相手なしで、0
2人目は、1/365 (2月29日生まれは無いので、1/366 は考えなくてよい)
3人目は、2/365 (当たりが2つある)
4人目は、3/365 (当たりが3つ・・)
5人目は、4/365 (当たりが4つ・・)

P5= 上を全部加算して、10/365 =1/36.5 

Pn へ拡張して、

Pn = Σk=1~n (k-1)/365

= 0 + 1/365 + 2/365 + ... + (n-1)/365 = (n-1)n/2 /365 = (n-1)n/730

P20= 19*20/730 = 38/73

※小生も、実は自信が無い、だれか採点してくれ (^^;)

  │  │└「(少なくとも2人が)同じ」のは、「すべ... 山中和義 2007/01/03 16:16:09  ツリーへ

Re: (2)の問題、
山中和義 2007/01/03 16:16:09
「(少なくとも2人が)同じ」のは、「すべての人が異なる」の余事象だと思います。
2人の場合、異なる確率は364/365、求める確率は1-364/365。
3人の場合、異なる確率は(364/365)*(363/365)、求める確率は1-(364/365)*(363/365)。
4人の場合、異なる確率は(364/365)*(363/365)*(362/365)、求める確率は1-(364/365)*(363/365)*(362/365)。

n人の場合、異なる確率は(364/365)*(363/365)*(362/365)* … *((365-n+1)/365)、
求める確率は1-(364/365)*(363/365)*(362/365)* … *((365-n+1)/365)。




同じことに着目すれば、以下のようになると思います。

n=1の場合、確率P0は0。

n=2の場合
1月1日で2人が同じとすると、
1人目がこの日付の確率 1/365
2人目がこの日付の確率 1/365
したがって、2人がこの日付の確率 1/365×1/365
日付は1月1日から12月31日まであるから
365×1/365×1/365=1/365=P2

n=3の場合
1月1日で2人が同じとすると、
1人目がこの日付の確率 1/365
2人目がこの日付の確率 1/365
3人目がこの日付以外の確率 364/365
3人の中の2人の組み合わせは3C2=3
3C2×(1/365)^2×364/365

1月1日で3人が同じとすると
1/365×1/365×1/365

日付は1月1日から12月31日まであるから
365×( 3C2×(1/365)^2×364/365 + 1/365×1/365×1/365 )=P3

  │  │ └ありがとうございます。 SECOND 2007/01/03 17:28:03  ツリーへ

Re: 「(少なくとも2人が)同じ」のは、「すべ...
SECOND 2007/01/03 17:28:03
ありがとうございます。
「(少なくとも2人が)同じ」のは、「すべての人が異なる」の余事象。
これは、すっきりします。納得です。同じ船に乗ります。

Pn=1−365Cn/365^n ・・こうしては、ダメかな?

  │  │  ├やっぱり、ダメだ。P2がおかしい。 SECOND 2007/01/03 17:46:56  ツリーへ

Re: ありがとうございます。
SECOND 2007/01/03 17:46:56
やっぱり、ダメだ。P2がおかしい。

  │  │  └こう書けば、どうか? SECOND 2007/01/03 18:09:32  ツリーへ

Re: ありがとうございます。
SECOND 2007/01/03 18:09:32
こう書けば、どうか?

Pn=1−365Pn/365^n ・・右のPは、順列のP

  │  │   ├!数値で確かめる。 SECOND 2007/01/03 22:37:50  ツリーへ

Re: こう書けば、どうか?
SECOND 2007/01/03 22:37:50
!数値で確かめる。
!P 1 = ?/365 0
!P 2 = ?/365 1.00000000000000000000000...
!P 3 = ?/365 2.99452054794520547945205... 3.0000..でないのは、相手2人が同日に重なる場合を含むから。
!P 4 = ?/365 5.96990805029086132482642... 6.0000..でないのも、相手2~3人が・・
!P 5 = ?/365 9.90448440042466010482832... 10.0000..でないのも、相手2~4人が・・
!P 6 = ?/365 14.76880653192569215818683...
!P 7 = ?/365 20.52603163003102324599746...
!P 8 = ?/365 27.13238170835919540292354...
!P 9 = ?/365 34.53769936954584317491425...
!P 10 = ?/365 42.68608486454334293224514...
!P 11 = ?/365 51.51660308743256641355349...
!P 12 = ?/365 60.96404792589350276821352...
!P 13 = ?/365 70.95975045983673007446403...
!P 14 = ?/365 81.43241688181514790742833...
!P 15 = ?/365 92.30898171374552579591053...
!P 16 = ?/365 103.51546191729023021525667...
!P 17 = ?/365 114.97779783324463108253309...
!P 18 = ?/365 126.62266752320310031978498...
!P 19 = ?/365 138.37826200151089263278188...
!P 20 = ?/365 150.17501000691169548203433...

OPTION ARITHMETIC DECIMAL_HIGH !10進1000桁
FOR n=1 TO 20
PRINT "P";n;"= ?/365 "; (1-順列365(n)/365^n) *365
NEXT N

!----
! n=365Pr 順列 Permutation
!----
FUNCTION 順列365(r)
LET w=365
FOR i=364 TO 366-r STEP -1
LET w=w*i
NEXT i
LET 順列365=w
END FUNCTION

END

  │  │   └!(2)の問題。での順列関数は、十進BASICに... SECOND 2007/01/06 19:13:02  ツリーへ

Re: こう書けば、どうか?
SECOND 2007/01/06 19:13:02
!(2)の問題。での順列関数は、十進BASICに 内蔵されていた!
! 順列 PERM(n,r) と 組合せ COMB(n,r) 両方ある。

OPTION ARITHMETIC DECIMAL_HIGH !10進1000桁

FOR n=1 TO 20
PRINT "P";n;"= ?/365 "; (1-PERM(365,n)/365^n) *365
NEXT N

END

!P 1 = ?/365 0
!P 2 = ?/365 1.00000000000000000000000...
!P 3 = ?/365 2.99452054794520547945205... 3.0000..でないのは、相手2人が同日に重なる場合を含むから。
!P 4 = ?/365 5.96990805029086132482642... 6.0000..でないのも、相手2~3人が・・
!P 5 = ?/365 9.90448440042466010482832... 10.0000..でないのも、相手2~4人が・・
!P 6 = ?/365 14.76880653192569215818683...
!P 7 = ?/365 20.52603163003102324599746...
!P 8 = ?/365 27.13238170835919540292354...
!P 9 = ?/365 34.53769936954584317491425...
!P 10 = ?/365 42.68608486454334293224514...
!P 11 = ?/365 51.51660308743256641355349...
!P 12 = ?/365 60.96404792589350276821352...
!P 13 = ?/365 70.95975045983673007446403...
!P 14 = ?/365 81.43241688181514790742833...
!P 15 = ?/365 92.30898171374552579591053...
!P 16 = ?/365 103.51546191729023021525667...
!P 17 = ?/365 114.97779783324463108253309...
!P 18 = ?/365 126.62266752320310031978498...
!P 19 = ?/365 138.37826200151089263278188...
!P 20 = ?/365 150.17501000691169548203433...

  │  ├!(4)の問題、この式には不思議が、いっぱ... SECOND 2007/01/04 06:30:54  ツリーへ

Re: お答えありがとうございます。
SECOND 2007/01/04 06:30:54
!(4)の問題 、この式には不思議が、いっぱい。

!数列{Xn}が次の漸化式で定義されている。
!        0=<X0=<1
!        Xn+1=AXn(1-Xn)
!1. 0<A<1のときのlim Xnの値を求めよ (αは、A の誤字として?無断で替えた)
!2. 1<A<2のときのlim Xnの値を求めよ


! n が大きくなって、
! Xn が収束するという事は、Xn+1 =Xn になって区別がつかなくなる事ですから、

! X=AX(1-X) の根 X が、=Xn =Xn+1 =lim Xn という事になります。

! 式を整理すると、0= X(1 -1/A -X) 、 2根 X=0, 1-1/A

! 0<A<1のとき、
! 0=<X0=<1 で、0=< AX(1-X) <0.25 、X1 は同じ 0~1 間に戻るため、
! 0=<X0=<1 から出発する限り、lim Xn=1-1/A (-∞~-0) の不動点は訪れない。
! lim Xn =0 のみ。

! 1<A<2のとき、
! 0=<X0=<1 で、0=< AX(1-X) <0.5 、X1 は同じ 0~1 間に戻るため、
! lim Xn =0 、lim Xn =1-1/A (0< ~<0.5) 両方とも条件に合う。



!** エピソード **

!この式は A がもっと大きくなると、不思議なことが起ります。
!1<A<3 までは、同じようにしていますが・・このグラフを見て下さい。
!sample\CHAOS3.BAS のスケールを少しいじったものです。

DEF f(x)=A*x*(1-x)
SET POINT STYLE 1
SET WINDOW -0.2, 4.2, -0.2, 1.2
SET axis COLOR(11)
DRAW grid(0.5,0.5)
PLOT TEXT,AT 0, 0.7:"(lim Xn)"
PLOT TEXT,AT 2.6, 0.01:"(A)"
ASK PIXEL SIZE(0,0; 4,1) p,q
FOR A=0 TO 4 STEP 4/(p-1)
LET x=0.5 ! 真中あたりから出発。(0=<X0=<1)
FOR n=1 TO 300
LET x=f(x) ! ある程度収束させてから、(...Xn)
NEXT n
FOR n=n TO n+q
LET x=f(x) ! 暴れ具合いを見る。(lim Xn)
PLOT POINTS:A,x
NEXT n
NEXT A
END

!隣接する Xn, Xn+1 の関係は、2次の関数に固定され、
!範囲も0~1に制限されていながら、収束もせず、周期も無くなって
!2度と同じ Xn には、訪れないという、カオス(chaos)状態になる。

  │  ├!(1)の問題、20については、意外な結果が... SECOND 2007/01/06 02:49:42  ツリーへ

Re: お答えありがとうございます。
SECOND 2007/01/06 02:49:42
!(1)の問題、20については、意外な結果が。

!整数を1個または2個以上の整数の和に分けて、得られた整数の積を最大に知ることを考えます。
! たとえば、10について10=1+9とすると積は9です。10=2+3+5とすると積は30です。
! 10について最大の積はいくつになるでしょうか
!
! 20について最大の積はいくつになるでしょうか


!----
!20については、1024= 4 4 4 4 4 ではなく、1458= 3 3 3 3 3 3 2 であった。
!分割の種類は 627 もある。

!再帰コールで読みにくいのを、我慢して下さい。無限な処理を可能にする方法
!です、時間をかけて慣れて下さい。しらみつぶしを、行っています。

OPTION BASE 0
DIM pat(22),mx(22)
LET pat(0)=999 ! pat(1)~pat(20):各整数

LET pat(21)=0 ! pat(21):各整数の最後の配列添字(分割数) pat(22):積
CALL divi( 10, pat, mx) ! 整数 10, 20 などを第1引数に。

PRINT "----- 積が最大になる分割 -----"
CALL prin( mx)

END

!---- 全ての分割数とスタイルのスキャン
EXTERNAL SUB divi( k, p(),m())
IF 0<k THEN
FOR w=0 TO k-1
IF p( p(21))>=k-w THEN
LET p(21)=p(21)+1
LET p( p(21))=k-w
CALL divi( w, p, m) ! 再帰CALL
END IF
NEXT w
ELSE
CALL lmax( p, m)
CALL prin( p)
END IF
LET p(21)=p(21)-1
END SUB


!---- 積の計算。最大を保存。
EXTERNAL SUB lmax( p(),m())
LET p(22)=1
FOR w=1 TO p(21)
LET p(22)=p(22)*p(w)
NEXT w
IF m(22)<p(22) THEN MAT m=p
END SUB

!---- 表示
EXTERNAL SUB prin( p())
PRINT USING"####= ":p(22);
FOR w=1 TO p(21)
PRINT p(w);
NEXT w
PRINT
END SUB

  │  │└分割単位を整数に限定しないで,任意の実数... 白石 和夫 2007/01/06 08:23:18  ツリーへ

Re: !(1)の問題、20については、意外な結果が...
白石 和夫 2007/01/06 08:23:18
分割単位を整数に限定しないで,任意の実数でよいことにしたら,どうなりますか?

  │  │ ├整数に限定すれば、正解は「1を含まずに、3... 荒田浩二 2007/01/06 10:20:50  ツリーへ

Re: 分割単位を整数に限定しないで,任意の実数...
荒田浩二 2007/01/06 10:20:50
整数に限定すれば、正解は「1を含まずに、3の個数が最大になるように分割する」だと思います。

分割した数の積も、元の数nが3の倍数かどうかで次のように決まります。

n=3*k のとき 3^k
n=3*k+1 のとき 2^2*3^(k-1)
n=3*k+2 のとき 2*3^k

さて、分割を実数にまで拡げると、どうも3ではなくe=2.71828のようです。

LET e=EXP(1)
FOR n=4 TO 100
FOR i=1 TO n
LET k=n/i
LET p=k^i
IF p>maxp THEN
LET maxp=p
LET maxi=i
END IF
NEXT i
PRINT USING "### ### ##.###### ###################":n,maxi,n/maxi,maxp
LET d=0
IF MOD(n,e)<1 THEN LET d=1
LET s=e^INT(n/e-d)*(MOD(n,e)+d*e)
IF s>maxp THEN PRINT "error !!"
NEXT n
END

n=6000で、分割した値は2.71862でした。

  │  │ └!個数も、実数ですか?10を、3.68個の2.717... SECOND 2007/01/06 14:17:56  ツリーへ

Re: 分割単位を整数に限定しないで,任意の実数...
SECOND 2007/01/06 14:17:56
!個数も、実数ですか? 10を、3.68個の 2.71739130434783 に分ける、など。

  │  └!(3)の問題 SECOND 2007/01/06 19:01:39  ツリーへ

Re: お答えありがとうございます。
SECOND 2007/01/06 19:01:39
!(3)の問題

!1から50までの整数の中から異なるいくつかを選んで、かけあわせて
!一の位が0にならないようにします。選ぶことができる整数は、最も多くて?個です。
!また、1から50までのすべての整数をかけあわせると、末尾に0が?個並びます。


!-----
! 10 の倍数にならないためには、
! 10の素数 2, 5,の何れか1つを統一して、素数に持たない数で積をとる。

OPTION ARITHMETIC DECIMAL_HIGH !10進1000桁

!----素数5を持たない数の、個数と積
LET m5=1
LET n5=0
FOR w=1 TO 50
IF 0<MOD(w,5) THEN
LET n5=n5+1
LET m5=m5*w
PRINT w;
END IF
NEXT w
PRINT
PRINT n5;"個の積";"=";m5

!----素数2を持たない数の、個数と積
LET m2=1
LET n2=0
FOR w=1 TO 50
IF 0<MOD(w,2) THEN
LET n2=n2+1
LET m2=m2*w
PRINT w;
END IF
NEXT w
PRINT
PRINT n2;"個の積";"=";m2

PRINT "選ぶことができる最大の個数=";MAX(n5,n2)
PRINT

!----
! 1~50 の積、末尾の 0 の個数は、
! 10の素数 2, 5,の セットの個数、1~50 の素数2と5の各全数の内、少ない方の個数。

LET n2=0
FOR w=1 TO 50
LET p=w
DO WHILE MOD(p,2)=0
LET p=p/2
LET n2=n2+1
LOOP
NEXT w
PRINT "素数2の全数=";n2

!----
LET n5=0
FOR w=1 TO 50
LET p=w
DO WHILE MOD(p,5)=0
LET p=p/5
LET n5=n5+1
LOOP
NEXT w
PRINT "素数5の全数=";n5

PRINT "素数2と5のセットの数(末尾の 0 の個数)=";MIN(n2,n5)

END

  問題1への試行 山中和義 2007/01/03 08:48:45  ツリーへ

Re: 教えてください
山中和義 2007/01/03 08:48:45
問題1への試行

この問題を「10個の石をいくつかの山に分けて、各山の石の個数を掛け合わせる。」と考えて、
「石を取る」方法がいくつあるかすべて列挙します。

冗長ですが、プログラムでの処理手順が見えてきます。


!樹形図(枝別れする図)を書いて考える

LET A=10

!10=10 ※1山の場合
PRINT A,A

!10=1+(9)、2+(8)、… ※2山
FOR i=1 TO A-1 !いくつ取れるか? ※1つは残しておく
PRINT i;"+";A-i,i*(A-i)
NEXT i

!10=1+1+(8)、1+2+(7)、… ※3山
FOR i=1 TO A-2 !2つは残しておく
FOR j=1 TO (A-i)-1 !i個取った残りからいくつ取れるか? ※1つは残しておく
PRINT i;"+";j;"+";A-(i+j),i*j*(A-(i+j))
NEXT j
NEXT i

!10=1+1+1+(7)、1+1+2+(6)、… ※4山
FOR i=1 TO A-3 !いくつ取れるか? ※3つは残しておく
FOR j=1 TO (A-i)-2 !i個取った残りからいくつ取れるか? ※2つは残しておく
FOR k=1 TO (A-(i+j))-1 !i+j個取った残りからいくつ取れるか? ※1つは残しておく
PRINT i;"+";j;"+";k;"+";A-(i+j+k),i*j*k*(A-(i+j+k))
NEXT k
NEXT j
NEXT i

!10=1+1+1+1+(6)、1+1+1+2+(5)、… ※5山
FOR i=1 TO A-4 !いくつ取れるか? ※4つは残しておく
FOR j=1 TO (A-i)-3 !i個取った残りからいくつ取れるか? ※3つは残しておく
FOR k=1 TO (A-(i+j))-2 !i+j個取った残りからいくつ取れるか? ※2つは残しておく
FOR l=1 TO (A-(i+j+k))-1 !i+j+k個取った残りからいくつ取れるか? ※1つは残しておく
PRINT i;"+";j;"+";k;"+";l;"+";A-(i+j+k+l),i*j*k*l*(A-(i+j+k+l))
NEXT l
NEXT k
NEXT j
NEXT i

!10=1+1+1+1+1+(5)、1+1+1+1+2+(4)、… ※6山



! 省略


!10=1+1+1+1+1+1+1+1+(2)、1+1+1+1+1+1+1+2+(1) ※9山


!10=1+1+1+1+1+1+1+1+1+(1) ※10山



END

  │├プログラムを変形してみよう。 山中和義 2007/01/05 22:30:30  ツリーへ

Re: 問題1への試行
山中和義 2007/01/05 22:30:30
プログラムを変形してみよう。

LET A=10 !石の数

!10=1+1+1+(7)、1+1+2+(6)、… ※4山
FOR i=1 TO A-3 !いくつ取れるか? ※3つは残しておく
FOR j=1 TO (A-i)-2 !i個取った残りからいくつ取れるか? ※2つは残しておく
FOR k=1 TO (A-(i+j))-1 !i+j個取った残りからいくつ取れるか? ※1つは残しておく
PRINT i;"+";j;"+";k;"+";A-(i+j+k),i*j*k*(A-(i+j+k))
NEXT k
NEXT j
NEXT i

END


う〜ん、う〜、こんな感じになる。


LET A=10 !石の数

LET c=4 !山の数

!10=1+1+1+(7)、1+1+2+(6)、…
LET wa=0
LET seki=1
FOR i=1 TO A-(c-1) !いくつ取れるか? ※予定の山の数は残しておく
PRINT i;"+"; !i個取ってこの山をつくる

LET wa=(0)+i !i個取って残りの山をつくる
LET seki=(1)*i
FOR j=1 TO (A-i)-((c-1)-1) !いくつ取れるか? ※予定の山の数は残しておく
PRINT TAB(6);j;"+"; !j個取ってこの山をつくる

LET wa=(i)+j !(i)+j個取る
LET seki=(i)*j
FOR k=1 TO ((A-i)-j)-(((c-1)-1)-1) !いくつ取れるか? ※予定の山の数は残しておく
PRINT TAB(12);k;"+"; !k個取ってこの山をつくる

LET wa=(i+j)+k !(i+j)+k個取って残りの山をつくる
LET seki=(i*j)*k
PRINT TAB(18);A-wa, seki*(A-wa) !最後の山をつくる
NEXT k
NEXT j
NEXT i

END


再帰呼び出しの手法が使えそうだ。

  ││└再帰呼び出しで簡潔だが、場合の数は多いの... 山中和義 2007/01/06 15:26:50  ツリーへ

Re: プログラムを変形してみよう。
山中和義 2007/01/06 15:26:50
再帰呼び出しで簡潔だが、場合の数は多いので計算時間が長くなる。


LET A=10 !石の数

FOR c=1 TO A !山の数
CALL div(c,A,1,0)
PRINT
NEXT c

END

EXTERNAL SUB div(c,A,seki,i) !山をつくる
IF c=1 THEN
PRINT TAB(6*i);A;" 積=";seki*A !最後の山をつくる
ELSE
FOR p=1 TO A-(c-1) !いくつ取れるか? ※予定の山の数は残しておく
PRINT TAB(6*i);p;"+"; !p個取ってこの山をつくる
IF c>1 THEN CALL div(c-1,A-p,seki*p,i+1) !残りの山をつくる
NEXT p
END IF
END SUB




Aを1から順に実行してみると
10の場合、順列で考えると2^(10-1)=512通りと推測できる。

20の場合、2^(20-1)通り?
画面出力は限界か! ファイル出力を検討しよう。

  ││ └SECONDさんと同じ手法で、、、 山中和義 2007/01/06 20:13:54  ツリーへ

Re: 再帰呼び出しで簡潔だが、場合の数は多いの...
山中和義 2007/01/06 20:13:54
SECONDさんと同じ手法で、、、
「長さAのひもをはさみで切っていく」をイメージしてプログラムしてみました。
p(21)がi、p(22)がsekiに対応するかと思います。
また、再帰呼び出しに付き物のスタックを使って、式を表示しています。

DECLARE EXTERNAL SUB a.div

LET A=10 !ひもの長さ
CALL div(A,1,0) !左手でひもの片方を持つ

END

MODULE a
SHARE NUMERIC cnt !出力回数
LET cnt=0
SHARE NUMERIC stk(0 TO 100) !順に切り落としたひもの長さ
!変数iはスタックポインタおよび数式を表示するTAB位置

PUBLIC SUB div
EXTERNAL SUB div(A,seki,i) !全長Aを長さpとA-pに2分割する
LET cnt=cnt+1
PRINT USING "#######:":cnt;
PRINT TAB(10);"積";seki*A;
FOR s=0 TO i-1 !切り落としたひもの長さを順に表示する
PRINT TAB(6*s+20);stk(s);"+";
NEXT s
PRINT TAB(6*i+20);A !左手に持ったひもの長さを表示する

IF A>1 THEN !右手にはさみを持って、切る位置を考える
FOR p=1 TO A-1 !全部 ※順列
!!FOR p=1 TO INT(A/2) !半分まで ※組み合わせ。切った結果は重複あり
LET stk(i)=p !切り落としたひもの長さp
CALL div(A-p,seki*p,i+1) !左手に残ったひもを順に切っていく
NEXT p
END IF
END SUB

END MODULE

  ││  └!これも、走らせてみて下さい。 SECOND 2007/01/07 02:14:59  ツリーへ

Re: SECONDさんと同じ手法で、、、
SECOND 2007/01/07 02:14:59
!これも、走らせてみて下さい。
!上書きしてすみません・・

OPTION BASE 0
DIM x(20)
!LET x(0)=0

LET A=10 !石の数

FOR c=1 TO A !山の数
CALL div(c, A, 1, 1, x)
!PRINT
NEXT c

END

EXTERNAL SUB div(c, A, seki, i, x()) !山をつくる
IF c=1 AND x(i-1)=<A THEN
FOR w=1 TO i-1
PRINT x(w);"+";
NEXT w
PRINT A;" 積=";seki*A !最後の山をつくる
ELSE
FOR p=1 TO A-(c-1) !いくつ取れるか? ※予定の山の数は残しておく
LET x(i)=p !p個取ってこの山をつくる
IF c>1 AND x(i-1)=<x(i) THEN CALL div(c-1, A-p, seki*p, i+1, x) !残りの山をつくる
NEXT p
END IF
END SUB

  │└数学的アプローチ相加・相乗平均、ラグラン... 山中和義 2007/01/07 10:42:40  ツリーへ

Re: 問題1への試行
山中和義 2007/01/07 10:42:40
数学的アプローチ 相加・相乗平均、ラグランジュの未定乗数法

●相加・相乗平均

荒田浩二さんがすでに提示されたプログラムですが、

!相加・相乗平均
!           n
!n√(x1*x2*…*xn) <= (Σxi)/n
!           i=1

LET A=10 !拘束条件 x1+x2+…+xn=10
DIM x(A)

FOR i=1 TO A
PRINT i;"分割",(A/i)^i !Σxi=A
NEXT i

END


これにより、4分割が最大になる。


20の場合はA=20として、7分割か?



●ラグランジュの未定乗数法

拘束条件 g=x1+x2+…+xn-10 の下、f=x1*x2*…*xnの最大値を求める。

2変数の場合、g=a+b-10、f=a*b

未定乗数λとして、f-λ*g=0を解く。

f-λ*g=0をaでの微分は、∂/∂a=b-λ=0。
bでの微分∂/∂b=a-λ=0。λでの微分∂/∂λ=-(a+b-10)=0。
λでまとめて連立方程式を解くと、a=5、b=5となる。





数学的なプログラミング(アルゴリズム、実行時間など)をすれば、検証する「場合の数」が減ります。

  問題2への試行 山中和義 2007/01/03 11:16:17  ツリーへ

Re: 教えてください
山中和義 2007/01/03 11:16:17
問題2への試行

順列、組み合わせを計算できる関数電卓を準備する。


FUNCTION 階乗(n) !n! ※関数FACT(n)でもよい
LET k=1
FOR i=n TO 1 STEP -1
LET k=k*i
NEXT i
LET 階乗=k
END FUNCTION
DEF 順列(n,r)=階乗(n)/階乗(n-r) !nPr=n!/(n-r)!
DEF 組み合せ(n,r)=順列(n,r)/階乗(r) !nCr=nPr/r!=n!/((n-r)!r!)
DEF 重複順列(n,r)=n^r !nΠr=n^r
DEF 重複組み合わせ(n,r)=組み合せ(n+r-1,r) !nHr=n+r-1Cr
DEF 円順列(n)=階乗(n-1) !(n-1)!
DEF 数珠順列(n)=階乗(n-1)/2 !(n-1)!/2


PRINT 階乗(4)
PRINT 順列(5,3)
PRINT 組み合せ(4,2)
PRINT 重複順列(3,2)
PRINT 重複組み合わせ(4,5)
PRINT 円順列(4)
PRINT 数珠順列(4)

END

  │└すべてを列挙して求める式を予測する。 山中和義 2007/01/06 22:39:17  ツリーへ

Re: 問題2への試行
山中和義 2007/01/06 22:39:17
すべてを列挙して求める式を予測する。
でも、場合の数が多いと計算時間がかかるので少ないもので検証しよう。
たとえば、さいころで考える。



DECLARE EXTERNAL SUB a.dice
DECLARE EXTERNAL FUNCTION a.NumOfAll, a.NumOfSame


LET A=3 !3個のさいころ
CALL dice(A,0)
PRINT
PRINT NumOfAll;"通りの中、一致回数は";NumOfSame;"です。 求める確率:";NumOfSame/(6^A)

END

MODULE a
SHARE NUMERIC SAME !一致回数
LET SAME=0
PUBLIC FUNCTION NumOfSame
EXTERNAL FUNCTION NumOfSame
LET NumOfSame=SAME
END FUNCTION

SHARE NUMERIC cnt !場合の数
LET cnt=0
PUBLIC FUNCTION NumOfAll
EXTERNAL FUNCTION NumOfAll
LET NumOfAll=cnt
END FUNCTION

SHARE NUMERIC stk(0 TO 100) !順に振ったさいころの目
!変数iはスタックポインタおよび数式を表示するTAB位置

PUBLIC SUB dice
EXTERNAL SUB dice(A,i) !さいころを振る
IF A<=0 THEN EXIT SUB

FOR p=1 TO 6 !すべての目 <-------------
LET stk(i)=p !出た目を記録する
IF A=1 THEN !最後なら
LET cnt=cnt+1
PRINT USING "#######:":cnt;
FOR s=0 TO i !順に表示する
PRINT TAB(5*s+10);stk(s);
NEXT s

FOR s=0 TO i-1 !当り判定
FOR t=s+1 TO i
IF stk(s)=stk(t) THEN
PRINT TAB(5*i+15);"一致";
LET SAME=SAME+1
GOTO 100
END IF
NEXT t
NEXT s
100 PRINT
ELSE !A>1のとき
CALL dice(A-1,i+1) !順に
END IF
NEXT p
END SUB

END MODULE

  問題3への試行 山中和義 2007/01/03 13:33:27  ツリーへ

Re: 教えてください
山中和義 2007/01/03 13:33:27
問題3への試行

1から50までの整数は、1から50までの素数
 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47
のべき乗の積で表される。(素因数分解)

 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

したがって、1から50までの積も同様である。

次に、10の倍数になるのは、10=2×5だから5の倍数に着目する。

5=2^0 * 3^0 * 5^1 * 7^0
10=2^1 * 3^0 * 5^1 * 7^0
15=2^0 * 3^1 * 5^1 * 7^0
20=2^2 * 3^0 * 5^1 * 7^0
25=2^0 * 3^0 * 5^2 * 7^0
30=2^1 * 3^1 * 5^1 * 7^0
35=2^0 * 3^0 * 5^1 * 7^1
40=2^3 * 3^0 * 5^1 * 7^0
45=2^0 * 3^3 * 5^1 * 7^0
50=2^1 * 3^0 * 5^2 * 7^0

これは、最初から2(2^a)と5(5^c)を含む数(10,20,30,40,50)と
2(2^a)と掛け合わせて10の倍数になる数(5,15,25,35,45)を意味する。



!十進1000桁モードか有理数モードで実行する

LET n=1
FOR i=2 TO 50
IF MOD(i,5)<>0 THEN !5,10,15,20,25,30,35,40,45,50を除く
LET n=n*i
END IF
NEXT i
PRINT n

END

  ヒント 荒田浩二 2007/01/03 19:01:34  ツリーへ

Re: 教えてください
荒田浩二 2007/01/03 19:01:34
ヒント

(1) 20を2分割する場合、積は10*10が最大になります。9*11や8*12よりも大きくなります。
2数の差が最小になるときです。
周の長さが一定の長方形では、正方形の面積が最大になるのと同じです。
 20を3分割する場合、6*7*7が最大になります。
3数相互の差が最小になるときです。
周の長さが一定の直方体では、立方体の体積が最大になるのと同じです。
 n分割のときも同様に考えます。
 何分割した場合に積の最大値を得られるでしょうか?

(2) やはり、同一誕生日がいない場合の確率から考えていきましょう。
P1=0
P2=1/365
3人目は、二人とも違っていてさらに3人目も違う場合を考えます。
P3=1-(1-1/365)*363/365
4人目も同様。
P4=1-(1-P3)*(365-3)/365
 このようにして、前項から計算していけると思います。

(3) この問題は2通りのアプローチがあると思います。
 ひとつは中学生にも理解できる解き方です。
10=2*5 に気がつけば解決できます。要は、偶数に5をかければ末位は必ず0になるということですね。
5の倍数はいくつあるでしょうか?
約数5はいくつ含まれているでしょうか?
 もうひとつの解き方は、実際に1からかけていく方法です。
ただし、階乗は爆発的に数値が大きくなるので計算には工夫が必要です。
この問題では末尾だけに注目しているので、末尾数桁を計算すればすみます。
また、末位に0が現われたら10で割っていけば効率よく計算できます。(10で割った回数をカウントしておくこと)。

(4)配列X(n)を使い、αやX(0)の値を次々に変えていきX(n)の収束値を計算していくしかないでしょうね。
 収束の様子を観察するにはグラフィックを利用する手もあります。

実は、4題ともプログラムを作ってみました。
ただ、おそらく学生さんの課題だと思うのでぜひ自力でプログラムを作っていただきたいので
私のプログラムは1週間後に公開します。

  問題4への試行 山中和義 2007/01/05 15:08:52  ツリーへ

Re: 教えてください
山中和義 2007/01/05 15:08:52
問題4への試行

X軸にXn、Y軸にXn+1のグラフを書いて考える。

●作図方法
まず、x0を決める。X軸上の点で範囲は0〜1。

(1)垂直方向(上方向か下方向)に線を引く
 点(x0,0)からまっすぐ上に向かって線を引く。
 曲線y=A*x*(1-x)(漸化式と等価)との交点(x=x0として求めた値y)がx1である。

 解釈
 ・漸化式の右辺XnからXn+1を求める。

(2)水平方向(左方向か右方向)に線を引く
 次にx2は、先に求めたx1を使うが、x0同様X軸上に求めるにはどうするか?
 まっすぐに右に向かって線を引く。
 直線y=xとの交点(直線y=xにy=x1を代入)からX軸に線を垂らす(x1=xすなわちx=x1)。
 この点がx1(x0と同様、X軸を基準)である。

 解釈
 ・漸化式の左辺Xn+1を次のXn(右辺側)とする。

(3)垂直方向(上方向か下方向)に線を引く
 (1)同様、点(x1,0)からまっすぐ上に向かって線を引く。曲線y=A*x*(1-x)との交点がx2である。

 以下、階段状に(水平・垂直の)線を引くことでXnを順に求めていくことができる。


●収束する場合の値
Xn=Xn+1となることを意味するから、直線y=x上の点となる。
これは直線y=xのもう1つの役割である。
じゃあ、どこになるか?
y=A*x*(1-x)との2つの交点、原点と点(1-1/A,1-1/A)である。
言い換えると、
・連立方程式y=x、y=A*x*(1-x)の解く
すなわち、
・特性方程式x=A*x*(1-x)の解
となる。



参考
 sample\chaos1.bas




!ロジスティック写像
FUNCTION Logistic(x,A)
LET Logistic=A*x*(1-x) !漸化式 Xn+1=A*Xn*(1-Xn)
END FUNCTION

LET A=2.9 !(0,4]
LET n=50 !第n項まで

SET WINDOW -0.1,1.1,-0.1,1.1 !座標を設定する
DRAW grid(0.1,0.1) !座標を描く

SET LINE COLOR 3
PLOT LINES: 0,0; 1,1 !y=xのグラフ
SET LINE COLOR 2
FOR x=0 TO 1 STEP 0.05 !y=A*x*(1-x)のグラフ
PLOT LINES: x,Logistic(x,A);
NEXT x
PLOT LINES
SET LINE COLOR 1 !元に戻す

PLOT TEXT ,AT 0,1: "Xn+1" !軸
PLOT TEXT ,AT 1,0: "Xn"


LET x1=0.1 !第1項 (0,1)

LET x=x1
DRAW disk WITH SCALE(0.0075)*SHIFT(x,0) !X0
PLOT TEXT ,AT x,0: "0"
PLOT LINES: x,0;

FOR k=1 TO n !Xn+1=F(Xn)のグラフ
LET x1=Logistic(x,A)
PLOT LINES: x,x1; !y=A*x*(1-x)との交点 ※垂直に線を引く
DRAW disk WITH SCALE(0.0075)*SHIFT(x,x1) !Xn+1
PLOT TEXT ,AT x,x1: STR$(k)

PLOT LINES: x,x1; x1,x1; !y=xとの交点 ※水平に線を引く
LET x=x1 !Xn
NEXT k


SET AREA COLOR 4 !収束する場合の値を描く
DRAW disk WITH SCALE(0.01)*SHIFT((A-1)/A,(A-1)/A) !特性程式x=A*x*(1-x)の解 (A-1)/A、0
DRAW disk WITH SCALE(0.01) !※「y=A*x*(1-x)とy=xの交点」と解釈できる

END


このノートはこれ以上発言できません。
新しくノートを作成 して、続きを書いてください。

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