コラッツの問題をグラフ化してみました。 会社員 2005/05/14 23:47:26 └おもしろいですね。なにか性質が見えてくる... 青木太一 2005/05/16 10:01:43 └多少修正し、見やすくしました。 会社員 2005/05/22 18:03:37 └読みやすいように少し修正。 会社員 2005/05/23 00:07:49
コラッツの問題をグラフ化してみました。 会社員 2005/05/14 23:47:26 ツリーへ
コラッツの問題をグラフ化してみました。 |
返事を書く |
会社員 2005/05/14 23:47:26 | |
コラッツの問題のグラフ化してみました。 以下の操作をすれば、 @「偶数なら、2で割る」 A「奇数なら、3倍して1足す。」 どんな自然数もいづれ1になるという仮説ですが、 グラフにすると面白かったので、書き込みをします。 @、Aの操作のいずれかを行えば、1操作として 1になるまでの操作回数を数えました。 例えば、 4の場合、 4→2→1で、操作回数=2回。 5の場合、 5→16→8→4→2→1で、操作回数=5回。 ================================================= ところで、もう少し、グラフを 見栄えよくできる方法があれば教えてください。 ================================================= !コラッツの問題のグラフ化 !コラッツの計算をする 偶数なら、2で割る 奇数なら、3倍して1足す。 LET MX=10000 DIM SOSA_SU(MX) FOR J=1 TO MX ! PRINT "J=";J; LET TST=J LET CNT=0 DO UNTIL TST=1 !コラッツの計算をする 偶数なら、2で割る 奇数なら、3倍して1足す。 LET CNT=CNT+1 IF MOD(TST,2)=0 THEN LET TST=TST/2 ELSE LET TST=TST*3+1 END IF LOOP LET SOSA_SU(J)=CNT !配列に 操作回数を入れる SOSA_SU() ! PRINT CNT;"回" NEXT J !グラフ化処理 I番目を位置(I,SOSA_SU(I))にプロットする。 !最大の操作回数を探す FOR J=1 TO MX IF KM<SOSA_SU(J) THEN LET KM=SOSA_SU(J) NEXT J PRINT "最大操作回数=";KM SET WINDOW -0.1*MX,MX*1.1,-0.1*KM,2*KM SET POINT STYLE 4 SET POINT COLOR 4 ! DRAW GRID PLOT LINES:-1000,0;MX,0 PLOT LINES:0,-0.1*KM;0,KM FOR J=2 TO MX PLOT POINTS:J,SOSA_SU(J) NEXT J PLOT TEXT ,AT 0.1*MX,1.7*KM : "コラッツ操作-実験結果" PLOT TEXT ,AT 0.1*MX,1.6*KM : "偶数なら、2で割る 奇数なら、3倍して1足す。" LET KM$=STR$(KM) PLOT TEXT ,AT 0.1*MX,1.5*KM : "最大操作回数= "&KM$ LET MX$=STR$(MX) PLOT TEXT ,AT 0.1*MX,1.4*KM : "調査範囲= "&MX$ PLOT TEXT ,AT -0.1*MX,0 : " 0" PLOT TEXT ,AT -0.1*MX,100 : " 100" PLOT TEXT ,AT -0.1*MX,200 : " 200" PLOT TEXT ,AT 5000,-0.1*KM : "5000" PLOT TEXT ,AT 10000,-0.1*KM : "10000" END |
└おもしろいですね。なにか性質が見えてくる... 青木太一 2005/05/16 10:01:43 ツリーへ
Re: コラッツの問題をグラフ化してみました。 |
返事を書く |
青木太一 2005/05/16 10:01:43 | |
おもしろいですね。なにか性質が見えてくるような、こないような... -log(J)な曲線的縞模様が見えたような気がしたので、 補正して横線の縞模様にできないかとPLOT POINTSをこのように変更してみました。 PLOT POINTS:J,SOSA_SU(J)+log(J)*40-300 うーん。なにか見えてくるような。見えてこないような。 |
└多少修正し、見やすくしました。 会社員 2005/05/22 18:03:37 ツリーへ
Re: おもしろいですね。なにか性質が見えてくる... |
返事を書く |
会社員 2005/05/22 18:03:37 | |
多少修正し、見やすくしました。 調査範囲を100,1000,10000としても、おもしろかったです。 !コラッツの問題のグラフ化 !コラッツの計算をする 偶数なら、2で割る 奇数なら、3倍して1足す。 LET XM=1000 DIM SOSA_SU(XM) FOR J=1 TO XM LET TST=J LET CNT=0 DO UNTIL TST=1 !コラッツの計算をする 偶数なら、2で割る 奇数なら、3倍して1足す。 LET CNT=CNT+1 IF MOD(TST,2)=0 THEN LET TST=TST/2 ELSE LET TST=TST*3+1 END IF LOOP LET SOSA_SU(J)=CNT !配列に 操作回数を入れる SOSA_SU() NEXT J !グラフ化処理 I番目を位置(I,SOSA_SU(I))にプロットする。 !最大の操作回数を探す FOR J=1 TO XM IF YM<SOSA_SU(J) THEN LET YM=SOSA_SU(J) NEXT J PRINT "最大操作回数=";YM SET WINDOW -0.2*XM,XM*1.1,-0.1*YM,2*YM SET POINT STYLE 4 SET POINT COLOR 4 ! DRAW GRID FOR J=2 TO XM PLOT POINTS:J,SOSA_SU(J) NEXT J PLOT TEXT ,AT 0.1*XM,1.7*YM : "◆コラッツ操作:実験結果◆" PLOT TEXT ,AT 0.1*XM,1.6*YM : "偶数なら、2で割る 奇数なら、3倍して1足す。" LET YM$=STR$(YM) PLOT TEXT ,AT 0.1*XM,1.5*YM : "最大操作回数= "&YM$ LET XM$=STR$(XM) PLOT TEXT ,AT 0.1*XM,1.4*YM : "調査範囲= "&XM$ PLOT LINES:0,-0.1*YM;0,YM !Y軸 描点を(x1 ,y1)に移動して描点をonにし,以後,描点を,(x2 ,y2) FOR J=0 TO YM IF MOD(J,100)=0 THEN PLOT TEXT ,AT -0.1*XM,J : STR$(J)&"回" PLOT LINES:-0.1*XM,J;XM,J !X軸 END IF NEXT J PLOT TEXT ,AT 0.5*XM,YM : "操作回数" PLOT TEXT ,AT 0.5*XM,-0.1*YM : STR$(0.5*XM) PLOT TEXT ,AT XM,-0.1*YM : STR$(XM) END |
└読みやすいように少し修正。 会社員 2005/05/23 00:07:49 ツリーへ
Re: 多少修正し、見やすくしました。 |
返事を書く |
会社員 2005/05/23 00:07:49 | |
読みやすいように少し修正。 !コラッツの問題のグラフ化 !コラッツの計算をする 偶数なら、2で割る 奇数なら、3倍して1足す。 LET XM=1000 DIM SOSA_SU(XM) FOR J=1 TO XM LET TST=J LET CNT=0 DO UNTIL TST=1 !コラッツの計算をする 偶数なら、2で割る 奇数なら、3倍して1足す。 LET CNT=CNT+1 IF MOD(TST,2)=0 THEN LET TST=TST/2 ELSE LET TST=TST*3+1 END IF LOOP LET SOSA_SU(J)=CNT !配列に 操作回数を入れる SOSA_SU() NEXT J !グラフ化処理 !最大の操作回数を探す FOR J=1 TO XM IF YM<SOSA_SU(J) THEN LET YM=SOSA_SU(J) NEXT J PRINT "最大操作回数=";YM ! 以下、グラフィック SET WINDOW -0.2*XM,XM*1.1,-0.1*YM,2*YM SET POINT STYLE 4 SET POINT COLOR 4 ! DRAW GRID FOR J=2 TO XM PLOT POINTS:J,SOSA_SU(J) ! J番目を位置(J,SOSA_SU(J))にプロットする。 NEXT J PLOT TEXT ,AT 0.1*XM,1.7*YM : "◆コラッツ操作:実験結果◆" PLOT TEXT ,AT 0.1*XM,1.6*YM : "偶数なら、2で割る 奇数なら、3倍して1足す。" PLOT TEXT ,AT 0.1*XM,1.5*YM : "最大操作回数= "&STR$(YM) PLOT TEXT ,AT 0.1*XM,1.4*YM : "調査範囲= "&STR$(XM) PLOT LINES:0,-0.1*YM;0,YM !Y軸 FOR J=0 TO YM IF MOD(J,100)=0 THEN PLOT TEXT ,AT -0.1*XM,J : STR$(J)&"回" PLOT LINES:-0.1*XM,J;XM,J ! 0回,100回,200回・・・ END IF NEXT J PLOT TEXT ,AT 0.5*XM,YM : "操作回数" PLOT TEXT ,AT 0.5*XM,-0.1*YM : STR$(0.5*XM) PLOT TEXT ,AT XM,-0.1*YM : STR$(XM) END |