新しく発言する EXIT インデックスへ
コラッツの問題をグラフ化してみました。

  コラッツの問題をグラフ化してみました。 会社員 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


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