2021年12月5日(日曜日)コラッツプレーンストーミング13
2021年12月5日(日曜日)コラッツプレーンストーミング13
----------------------------------------------
2021年11月29日(月曜日)
LibreOffice Calcでマクロが記入できるところが複数ある感じ。
LibreOfficeのセキュリティの関係で、シートにはマクロのモジュールを紐づけできないようにしてある感じ。セキュリティの設定を下げると紐づけできるようだが、それだと、外部から来たファイルで、ウィルス感染なんてことになる可能性も有るのでセキュリティは下げられない。
マクロをいろいろいじっていて大した成果はなかった。メモリ上のArrayとセルの位置関係や、セルの二次元配列についての位置関係などいろいろパラメータを変更してコラッツ数列の一部を表示したりしていた。とりあえず、回数をカウントして値Nの左に表示してソートさせる様な環境にはなったが、1行目をどのように扱うか?。計算回数を表示するようにしたら、ソートしたらどこかに紛れ込んだので、一行目は空白行にしておくことにした。
セルに組み込み関数を使って数列を表示できるようにしてあるが、その行を100000行*32列までふやしていたのだが、ソートをしようとすると、ソート対象の上側に、行を連続してパラメータ用のセルを設定してあったのだが、そのパラメータのセルまでソート対象範囲が拡大したので、一行だけ上にドラッグしてずらしたら、完了するまでに2時間かかった。
2021年11月30日(火曜日)
相変わらず1000000行まで、arrayを使ってメインメモリで処理をしようとするとメモリ不足で落ちる。
このコードを書いた時に、目視用のコードも併記していたので、arrayメモリを使わずに、セルへ直接書き込んだらどうなるのか?。
メモリ不足でLibreが落ちると、メインメモリは解放されるが、スワップメモリが解放されないので、後の作業に影響を与えるのでリブートが必要になり、めんどくさい。
arrayを使わない方法だとメモリ消費がほとんど増えない。メモリ42%で、スワップも発生しない。しかし時間がかかる。セルに組み込み関数を設定した場合と変わらないくらいの時間がかかるのだろうか?どうなのだろう。あとは、ファイルのサイズがどれだけ減るのか?。半分くらいになっていればいいかなくらいの感じか。
結果が出るのを待っている間、こっちにコードを控えておくか。大量にメモリを消費してない分、コードのエリアも普通にスクロールできる。arrayでメモリを使っていた時は、スクロールもできなかった。
一時間で、約二十万行、わぉ、五時間コースになりそうだ。
Sub CollatzSequences
' Sheets(0)のデータの削除
thisComponent.Sheets(0).clearContents(511) ' Sheets(0)のデータの削除
' thisComponont.AddActionLock() '表示の停止?
Dim N As Long '値N
Dim colN As Long '値Nの列を指定する?
Dim colW As Integer '値Nの左側に作業用の列を確保
Dim colSeq As Integer '数列の列を指定する
Dim Count As Integer '計算回数、つまり数列の値の数、数列の長さ。
'メインメモリ配列用start
Dim aryData() As Integer
Dim vL As Integer 'Left
Dim vT As Integer 'Top
Dim vR As Integer 'Right
Dim vB As Integer 'Bottom
'getCellRangeByPosition(left, top, right, bottom)
vL = 0
vT = 0
vR = 25 ' 列数の指定
vB = 50 ' 行数の指定 = 値の指定。(値は-1された値まで調べる?)
'メインメモリ配列用end
' aryData メインメモリ使用。セルの値をメモリへ読み込む。
' 読み込む前に、セルのデータを消しておくこと。
'aryData = thisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
Dim IRow As Long, iCol As Integer
iRow = 0
colW = 1
Count = 0
colN = colW
For iRow = 1 to vB - 1
N = iRow
colSeq = colN + 1
thisComponent.Sheets(0).getCellByPosition(colN, iRow ).Value = N '目視用、セル書
' aryData(iRow)(colN) = N 'メインメモリ書き込み用
if N = 1 then
goto continue1:
endif
Do until N = 1
if colSeq = vR - 1 then
exit Do
endif
continue1:
if N mod 2 = 0 then
N = N / 2
thisComponent.Sheets(0).getCellByPosition(colSeq, iRow).Value = N '目視用セル書
' aryData(iRow)(colSeq) = N'メインメモリ書き込み用
else
N = 3 * N + 1
thisComponent.Sheets(0).getCellByPosition(colSeq, iRow).Value = N '目視用セル書
' aryData(iRow)(colSeq) = N'メインメモリ書き込み用
endif
colSeq = colSeq + 1
Count = Count + 1
loop
if iRow = 0 then
Count = ""
endif
thisComponent.Sheets(0).getCellByPosition(0, iRow).Value = Count '目視用セル書
' aryData(iRow)(0) = Count 'メインメモリ書き込み用
Count = 0
next iRow
' thisComponent.Sheets(0).clearContents(511)
' thisComponent.AddActionLock()
' thisComopnent.Sheets(0).getCellRangeByPosition(vL, vT, vR, vB).setDataArray(aryData)
thisComponent.removeActionLock()
erase aryData
End sub
時間かかりすぎ。
500000ぐらいで区切って複数回をつなぎ合わせる感じにすれは1000000行以上も可能か?。
必要とする情報を、必要とするときに、必要とする場所で。
Countを利用して、数列の長さで区切りをつけて検証する列数以内の、計算回数の数列だけをarrayメモリに記入するようにすればよいのか?。それにより、長い数列の値Nを除けて、メモリ使用量が減る。
そもそも、このマクロを作ったのは、22列くらいまでの数列を並び替えて、どういうふうに見えるのか、どういうふうに見ることができるのかを調べようとして作ったもの。すべての値は必要ない、数列が特定の長さより短いものだけを、arrayに記憶すべき。
あとは、セルへの組み込み関数を使ったファイルとのサイズの比較。
とりあえず、6時間20分ぐらいかかった感じ。で、いったん上書き保存をして、通常終了させて、保存って感じ。保存前のサイズが、7.5KB、保存後が、おい、なんだそれ、145.6MBだと。とりあえず正常終了させるとするか。組み込み関数のファイルよりも大きいってことは?どちらかの行数を間違えている可能性あり。
やっぱ数え間違いだった。組み込み関数の方が100000行*32列だった。一ケタ少なかった。
組み込み関数の100000行のソートに約15分かかった。
1000000行*31行、145.6MBのファイルで起動に約10分かかった。ソートしようとしたが、ソートの画面が出てくるのに約10分、そこから。メインメモリが足りなくなりスワップファイルの消費が増えた。
ソートキー選択まで15分くらいかかった。OKボタンを押してしばらくしたら、Calcが落ちた。メモリ不足だ。やはり、列数でふるいにかけないとだめなようだ。とりあえず、1からではなく途中の数字からコラッツ数列を出せるようにしたやつがあるので、そいつで、列数でふるいにかけるコードを作る必要あり?。
メモリーの動的確保とかも考えておく必要あり?。
行に数列を書き出す。iRow, Count
列数が22未満なら、そのまま残す。Count
列数が22以上なら、その行に上書き。Count, iRow
2021年12月1日(水曜日)
上のマクロをエクセルに貼りつけてみたら、表現方法の違いで、thisComponentとかがはじかれる。
とりあえず、任意の位置からコラッツ数列を表示するコードに計算回数、数列の長さを表示できるようにする。上のマクロを参照しながら。
.getDataArray()で、メモリを確保しなくてもよいだろうと思って、「'」でコメント扱いに変更してから動作確認せずに、回数の算出を組み込み初め、動作確認しようとしたら、Index out of defined rangeのメッセージ。新たに記入したコードを削除したが状況変わらず、で、メモリの確保?の件を思い出し、元に戻して一件落着。
とりあえず、Countの表示までできた。
行に数列を書き出す。iRow, Count, colSeq
列数が22未満なら、そのまま残す。Count, colSeq, vR
列数が22以上なら、その行に上書き。Count, iRow, colSeq, vR
行に数列を書き出す。iRow, Count, colSeq
' 列数が22未満なら、そのまま残す。Count, colSeq, vR
列数が、vRに達した時点、もしくはループを抜けた時点でNが1になっていたら残す。
列数が22以上なら、その行に上書き。Count, iRow, colSeq, vR
上書きだと、arrayの末尾の方で前のデータが残る可能性がある。その行のクリアが必要。
iRowを、next iRowで一増やした後に、一減らして、同じ行を使う仕組みが必要。
行に数列を書き出す。iRow, Count, colSeq
列数が、vRに達した時点、もしくはループを抜けた時点でNが1になっていたら行を残す。
列数が22以上なら、その行のクリア。
または、ループを抜けた時点でNが1になっていなければその行をクリア。
iRowからクリアした回数を引くカウント、clrRowに、+1。
iRow + 1 された後に、iRow - clrRow する。
全体を回している?値Nを順番どおりに処理するための?iRowに変更を加えるとおかしくなるのでiRowに変更は加えずに、書き込む行の専用カウンターを用意すべき?。
ループを抜けた時にN=1ならば、書き込む行を、+1し、N<>1ならば、+1しない。
書き込みのアドレスにiRowを使っているので変更箇所が多すぎる。書き込みアドレスはiRowのままにして、全体を回しているカウント名の方を変更すればよい?。SttEnd
Do until clrRow = vR
thisComponent.Sheets(0).getCellByPosition(clrRow, iRow).Value = ""
sryData(iRow)(clrRow) = ""
clrRow = clrRow + 1
loop
の、コードでクリアしようとすると、シートのセルに数字の0が入る。arrayメモリからセルに書き出した時は表示無し。Value="" ではなく、NullとかEmptyとかを指定しないとダメか?。デバッグで気になるだけだから無視してもよいのかもしれない。ただ、計算速度に影響があるのかどうかがわからない。
とりあえず、値100くらいまでの値で、数列が20以内の数列だけを表示することができた。その数列に、メニューのData > Sort で、カウントとN値を指定したら、欲しいものができた。
1000000でやる前に正常終了させて、マシンのリブート。
19;524288,262144,131072,65536,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
この数列が270行目。
1050000で19列だと270行。
300000000だと32列で何行なのか?。
結果が出るまでのひまつぶしにタイピング練習も兼ねて、コードをここへ入力。
追加と変更で、関係ない変数もそのまま記入する。
sub getArrayDataAndSet
thisComponent.Sheets(0).clearContents(511)
thisComponent.AddActionLock()
Dim N As Long
Dim colN As Long
Dim colSeq As Integer
Dim iRow As Long
Dim iCol As Integer
Dim nStt As Long
Dim nEnd As Long
Dim SttEnd As Long
Dim Count As Integer
Dim colW As Integer
Dim nC As Long
Dim clrRow As Long
'コラッツ数列開始値と終了値s
nStt = 1 '開始する値
nEnd = 100000000 '終了する値
'コラッツ数列開始値と終了値e
'arrayメインメモリへの操作?s
Dim aryData() As Variant
Dim vL As Integer
Dim vT As Integer
Dim vR As Integer
Dim vB As Integer
Dim mvR As Integer
Dim mvB As Integer
vL = 0
vT = 0
vR = 30
vB = nEnd - nStt + 2
' vB = 100000000 '場合によってはこっち
'arrayメインメモリへの操作?e
Dim mMemR As Integer
Dim mMemB As Integer
mvR = 0
mvB = 0
colW = 1
colN = colW
nC = 0
Count = 0
arydata = thisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
'arydata = thisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB/10000).getDataArray()
'(vL,vT,vR,vB/10000)は、数列の短いものの表示には使用メモリを減らせる。
iRow = 1
For SttEnd = 1 to vB -1
N = nStt + nC
colSeq = colN + 1 '値Nと数列の位置関係
thisComponent.Sheets(0).getCellByPosition(colN + mvR , iRow + mvB).Value = N
aryData(iRow)(conN) = N
if N = 1 then
Goto Continue1:
endif
Do until N = 1
if colSeq = vR -1 then
exit Do
endif
Continue1:
if N mod 2 = 0 then
N = N / 2
thisComponent.Sheets(0).getCellByPosition(colSeq + mvR , iRow + mvB).Value = N
aryData(iRow)(colSeq) = N
else
N = 3 * N + 1
thisComponent.Sheets(0).getCellByPosition(colSeq + mvR , iRow + mvB).Value = N
aryData(iRow)(colSeq) = N
endif
colSeq = colSeq + 1
Count = Count + 1
Loop
nC = nC + 1
thisComponent.Sheets(0).getCellByPosition(0 , iRow).Value = Count
aryData(iRow)(0) = Count
Count = 0
if N <> then
clrRow = 0
Do Until clrRow = vR
thisComponent.Sheets(0).getCeelByPosition(clrRow + mvR,iRow + mvB).Value = ""
aryData(iRow)(clrRow) = ""
clrRow = clrRow + 1
Loop
else
iRow = iRow +1
endif
next SttEnd
thisComponent.AddActionLock()
thisComponent.Sheets(0).clearContents(511)
thisComponent.Sheets(0).getCellRangeByPosition(vL, vT, vR, vB).setDataArray(aryData)
thisComponent.removeActionLock()
Erase aryData
End sub
一部表示がながくなるので使っていない位置変更用の変数mvRとmvBを削除した。
(vL + mvR, vT + mvB, vR + mvR, vB+mvB).setDataArray(aryData)
120,000,000行*22列
1,000,000行で22列以下?未満?が544行くらいで約20分。
20*120 = 2400
2400/60 = 40時間って...。
120Mもいらなかった。
1000000*24
とりあえず10,000,000行の24列で8388608を得る予定。2^23
約10分でSttEndが415494
約1時間後、値SttEndが2542053で、iRowが856。4時間コースか。
数列が1にならなかったものを消している時間が無駄だったか?。アクセス回数がほぼ二倍になっている?。消さずにメモリを消費させるべきだったか?。
20:30で、6078190の867。 cpu time 4:23:00 もしかして、数字が大きくなってきたからその分計算時間が増えている感じかな?。
21:00で、7544935の867。cpu time 4:55:02 iRowが867で変わらずってことは、もしかして残りは8388608だけか?
21:20頃、overfllowで落ちた。式の、N = 3 * N + 1が反転していた。
arrayを使わずに、ThisComponent.AddActionLock()だけで乗り切れるか?。
セルに書き出しながら進めていく方でclrRowのポジションを使用している式でValue
thisComponent.Sheets(0).getCeelByPosition(clrRow + mvR,iRow + mvB).Value = ""
thisComponent.Sheets(0).getCeelByPosition(clrRow + mvR,iRow + mvB).Formula = "" に変更したら、空白のセル表示になってくれた。
メインメモリのエリアを確保した場合、何かのエラーになった時に、セルに書き出すことができない。エラーの事を考えるならば、セルに書き出したほうがよい?どうなのだろう。
2021年12月2日(木曜日)
09:34 2021/12/02
まいった、まだおわってない。SttEnd=1626281,iRow=855,CPUTime=11:08:51
寝る前に計算させたまま放置して朝には終わっているだろうと思っていたがまだ終わっていない。
解決策として、折衷案というかハイブリッドというか、arrayで計算して、10万行おきにセルに出力する事を繰り返して大きな数字までたどり着くようにしないと厳しい感じ。
とりあえず、1048576はこえているようなので、いつ終了してもいいかなって感じではあるが、2097152まで、待ってみるか。
10:38 2021/12/02
SttEnd=1779530, iRow=855, CPUTime=12:09:37
変数の、mvBにセルへの書き出し用のアドレスを持たせる?。
iRowと100000を比較し、100000ならば、arrayからcellへ書き出し、
そういえば、hisComponent.AddActionLock()が解除されてるような感じだが、どのタイミングで解除されるのか?。
数列を出す作業をアレイでおこなって、1になったらセルに書き出し、0行目の空白行を読み込んでリセットの繰り返し?
11:51 2021/12/02
iRow=855, SttEnd=1963565, CPUTime=13;23;27 で、iRowの値が変わらない。
12:43 2021/12/02
iRow=855, SttEnd=2094026, CPUTime=14:15:34
12:46 2021/12/02
iRow=856を確認。2097152も確認した。
14:42 2021/12/02
iRow=856, SttEnd=2385262, CPUTime=16:15:19
この辺でやめて、改良を始めるか。61.5KBが、69.0KB
17:55 2021/12/02
とりあえず、アレイメモリ上の配列行を一万くらいで、値は一から一千万くらいまででとりあえず動かしている。
iRow = 656, SttEnd = 250400, CPUTime = 05:27:39 で、暇つぶしのコード入力練習?バックアップと一覧表示による考察?
あ、今頃重要な事を思い出した。メインメモリの読み書きを頻繁に行うとメインメモリが劣化する。
Sub GetArrayDataAndSet
'まずはシートの内容を消す。
ThisComponent.Sheets(0).clearContents(511) 'シートの内容を消す。
' ThisComponent.AddActionLock() '作業エリアがアレイメモリなので今回はロックしないで実行。
Dim N as Long '計算用の値N
Dim colN as Long 'Nを表示する列、通常0 + colW。
Dim colSeq as Integer '数列の列のアドレス
Dim iRow as Long '行のアドレス
Dim iCol as Integer '
Dim nStt as Long '算出する数列の為の最初の値
Dim nEnd as Long '算出する数列の為の最後の値
Dim SttEnd as Long 'nSttからnEndまでのカウンター
Dim nC as Long 'Nのカウント上げ用
Dim clrRow as Long '1にならなかった数列がある最終行を消すためのアドレス
Dim colW as Long '値Nの左側にCount等の表示列確保
Dim Count as Integer '計算回数、ステップ数、列の数。
'コラッツ数列開始値と終了値s
nStt = 1
nEnd = 10000000
'
nKai = 23 'nKaiの回数以内に1になる数列をピックアップ
'nKai表示する数列の値と、最大計算回数を考慮して指定する。320、600
'コラッツ数列開始値と終了値e
'arrayメインメモリへの操作?s
Dim aryData() as Variant
Dim vL as Integer
Dim vT as Integer
Dim vR as Integer
Dim vB as Long
Dim mvR as Integer
Dim mvB as Long
'getCellRangeByPosition(left, top, right, bottom)
vL = 0
vT = 0
vR = nKai + 3 'colW=1, N, vRの右端、の三列分余計に確保。
vB = 10000
' vB: arrayのメインメモリ上の確保する行数。大きすぎるとメモリ不足になり落ちる。
' vB: 大きすぎるとメモリ不足になり落ちる。
' vB: 通常のコラッツ数列、vB = nEnd - nStt + 3 かな?vR
'arrayメインメモリへの操作?e
Dim mMemR as Integer
Dim mMemB as Integer
mvR = 0
mvB = 0
colW = 1
colN = colW
nC = 0
Count = 0
'aryDataのメモリ確保?
aryData = ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
iRow = 1
' For iRow = 1 to vB -1
' For SttEnd = 1 to nEnd - 1 'overflowの原因初期値が1
' For SttEnd = nStt to nEnd - 1 ' アレイではないので-1は不要。
For SttEnd = nStt to nEnd
N = nStt + nC
colSeq = colN + a
aryData(iRow)(colN) = N '値Nのアレイメモリへの記入
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
if N = 1 then
Goto Continue1:
endif
Do Until N = 1
if colSeq = vR - 1 then
Exit Do
endif
Continue1:
if N mod 2 = 0 then
N = N / 2
aryData(iRow)(colSeq) = N
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
else
N = 3 * N + 1
aryData(iRow)(colSeq) = N
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
endif
colSeq = colSeq + 1
Count = Count + 1
Loop
nC = nC + 1
aryData(iRow)(0) = Count
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(0, iRow).Value = Count
Count = 0
if N <> 1 then
clrRow = 0
Do Until clrRow = vR
aryData(iRow)(clrRow)= ""
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(clrRow + mvR , iRow + mvB).Formula = ""
clrRow = clrRow + 1
Loop
else
iRow = iRow + 1
endif
next SttEnd
' ThisComponent.Sheets(0).clearContents(511)
ThisComponent.AddActionLock()
ThisComponent.Sheets(0).getCellRangeByPosition(vL + mvR, vT + mvB, vR + mvR,vB + mvB).setDataArray(aryData)
ThisComponent.removeActionLock()
' Erase aryData
End Sub
18:14 2021/12/02 iRow = 676, SttEnd = 1000419 CPUTime = 20:57.52
18:34 2021/12/02 iRow = 687, SttEnd = 1908710 CPUTime = 40:03.69
18:54 2021/12/02 iRow = 688, SttEnd = 2874242 CPUTime = 1:00:20
19:16 2021/12/02 iRow = 688, SttEnd = 3950607 CPUTime = 1:22:41
19:24 2021/12/02 iRow = 689, SttEnd = 4298143 CPUTime = 1:30:04
朝方の時とiRowが少ないなと思ったら、vRが23+3=26だった。前日からの分ではvR=30で27回以下のピックアップだった。
19:58 2021/12/02 iRow = 689, SttEnd = 5918585 CPUTime2:03:56
20:49 2021/12/02 CPUTime = 2:53:15 OverFlow でエラーになった。「N = 3 * N + 1」が反転していた。
やはり、途中でメインメモリからセルに書き出すようにしないとダメなようだ。
それと、たぶん終了時に
' For SttEnd = 1 to nEnd - 1 'たぶんOverflowの原因は、初期値が1。nSttに変更。
For SttEnd = nStt to nEnd -1
nEndを100、vBを10にした場合どのようなエラーになるのか?。
Error:
Inadmissible value or datatype.
Index out of defined range.
nEnd が100なのに、Nが99で終わる。
「 For SttEnd = nStt to nEnd -1」の -1 をコメント化
For SttEnd = nStt to nEnd '-1
一から百までを、メインメモリに10溜まったらセルに書き出し、メインメモリをクリアして、また、メインメモリに10溜まったらセルの続きに書き出す、これを繰り返す?。
2021年12月3日(金曜日)
OverFlow。寝る前に1から120000000までの30列、実質27列で数列をアレイメモリを使って抜き出していたが、落ちていたようだ。大きな数字を使う場合は最大値を使ったテストをしてから本番開始すべき。開始を1から119999990にして動かしたら、Error:Inadmissible value or data type. OverFlow.
Long では足りなかったようだ。1025156249 * 3 = 3075468747で、Long型の2147483647を越えた為にOverFlowしたもよう。
Dim N as Double
に、してみたら、またOverFlow。
式が、if N mod 2 = 0 then のところで止まった。
if N / 2 = 0 then
に、してみたら計算は正常終了した感じ。
nStt=119999990, nEnd=120000000で700列、vB=100000で実行したら、スワップ発生。メインメモリ、スワップメモリともに100%近くのところまできて、処理が重くなった。CPU使用率は30%くらいなので、計算のところまでたどり着いてない感じ。で、結局落ちた。保存してなかったので変更箇所が元に戻っている。まぁ、元に戻す手間が減ったと思えばラッキーかな。
で、N as doubleにして、if N / 2 = 0 thenにして、nStt=119999990、nEnd=120000000、nKai=730、vB=100で実行したらまたオーバー不老じゃなくて、Over Flow。
$$$$$$$$$$2021/12/05追記。
if N / 2 = 0 then って、0になるNは2だけだろ。今頃気が付いた。
$$$$$$$$$$2021/12/05追記。
119999990が、開始のNで、
5165606111056150に、16回目ぐらいでなって、そのあとからE+016の記号がついて、
1.54968183331685E+016に、17回目ぐらいでなって、
1.54330026348752E+308に、629回目ぐらいでなって、Over Flowでおちた。
この状態で、1から10までを表示しようとしたら、表示できなかった。
if N / 2 = 0 thenを元の、if N mod 2 = 0 thenに戻したら、表示された。
mod演算子がLong型の為、modでOver Flowが起きるもよう。コンピュータの限界を越えようとしても限界はあるので、この辺であきらめるか。
「一から百までを、メインメモリに10溜まったらセルに書き出し、メインメモリをクリアして、また、メインメモリに10溜まったらセルの続きに書き出す、これを繰り返す。」
これも考えるのはやめておこう。
コラッツ予想 3N+1問題を拡張し、aN+b問題として考えると、
計算の成分にマイナスが入り込むために絶対値がゼロ側にずれるために過去の値とぶつかりループする。その判例として3N+1を示す?ちょっと違うか?。
aN+bでは必ず、1000以下?100以下?の値でループが発生し、大きな数値もそのループを引き継いでいる。ループが起きない場合はどのような場合か、判例として3N+1を示す?
1ステップめは、1個。
2;1
2ステップめは、1個。
偶数2が倍数列値で偶数の分岐する値の4になった。
4;2,1
3ステップめは、2個。
分岐値が約数列値で奇数の1と倍数列値で偶数の8に分かれた。
1;4,2,1
8;4,2,1
4ステップめは、1個。ここから始まる感じ。
偶数の8が、倍数列値で偶数の分岐する値の16になった。
16;8,4,2,1
5ステップめは、2個。
分岐値16が、約数列値で奇数の5と、倍数列値で偶数の32に分岐した。
5;16,8,4,2,1
32;16,8,4,2,1
6ステップめは、2個。
奇数5が、倍数列値で偶数の分岐する値の10になった。
偶数32が、倍数列値で偶数の分岐する値の64になった。
10; 5,16,8,4,2,1
64;32,16,8,4,2,1
7ステップめは、4個。
分岐値10が約数列値で奇数の3と倍数列値の偶数の20に分岐した。
分岐値64が約数列値で奇数の21と倍数列値の偶数の128に分岐した。
3;10, 5,16,8,4,2,1
20;10, 5,16,8,4,2,1
21;64,32,16,8,4,2,1
128;64,32,16,8,4,2,1
8ステップめは、4個。
3の倍数で奇数の3と21が、倍数列値で3の倍数の6と42になった。
偶数の20と128が倍数列値で偶数の分岐する値の40と256になった。
6; 3,10, 5,16,8,4,2,1
40; 20,10, 5,16,8,4,2,1
42; 21,64,32,16,8,4,2,1
256;128,64,32,16,8,4,2,1
接続点?合流点?、接続値?合流値?。どの呼び方が良いのだろうか?。
接続と切断?ここでは切断はない。合流と分岐?コラッツ数列では合流点になるが、逆数列だと分岐点になる。それを考えると、合流と分岐を使うべきだろう。
逆数列の場合、合流値になると約数列と倍数列に分岐する。新たな定義の確定?。
逆数列として説明しているので、合流値ではなく分岐値と言うことにする。
コラッツ数列:3N+1:N/2:では、合流値もしくは分岐値は、(N-1)/3の整数のみ。
ここの文言の上の各ステップの説明も書き直し。
これ以降、下降数列16の8からの部分数列の記入は省略することにする?。しない。
9ステップめは、6個。
3の倍数の6と42は倍数列値で3の倍数の12と84になった。
分岐値の40と256は、約数列値で奇数の13と85、倍数列値で偶数の80と512に分岐した。
12; 6, 3,10, 5,16,8,4,2,1
13; 40, 20,10, 5,16,8,4,2,1
80; 40, 20,10, 5,16,8,4,2,1
84; 42, 21,64,32,16,8,4,2,1
85;256,128,64,32,16,8,4,2,1
512;256,128,64,32,16,8,4,2,1
10ステップめは、6個。それぞれが倍数列値になった。
3の倍数の12と84は、倍数列値で3の倍数の24と168になった。
奇数の13と85は、倍数列で偶数の26と170になった。
偶数の80と512は、倍数列値の偶数の分岐する値160と1024になった。
24; 12, 6, 3,10, 5,16,8,4,2,1
26; 13, 40, 20,10, 5,16,8,4,2,1
160; 80, 40, 20,10, 5,16,8,4,2,1
168; 84, 42, 21,64,32,16,8,4,2,1
170; 85,256,128,64,32,16,8,4,2,1
1024;512,256,128,64,32,16,8,4,2,1
11ステップめは、8個。
3の倍数の24と168は倍数列値で3の倍数の48と336になった。
偶数の26と170は倍数列値で偶数の分岐する値の52と340になった。
分岐値の160と1024は、約数列値で奇数の53と341、倍数列値で偶数の320と2048に分岐した。
48; 24, 12, 6, 3,10, 5,16,8,4,2,1
52; 26, 13, 40, 20,10, 5,16,8,4,2,1
53; 160, 80, 40, 20,10, 5,16,8,4,2,1
320; 160, 80, 40, 20,10, 5,16,8,4,2,1
336; 168, 84, 42, 21,64,32,16,8,4,2,1
340; 170, 85,256,128,64,32,16,8,4,2,1
341;1024,512,256,128,64,32,16,8,4,2,1
2048;1024,512,256,128,64,32,16,8,4,2,1
2021年12月4日(土曜日)
素人の、つぎはぎだらけのコード。
全角の空白文字が入っているとエラーが出る。
Sub CollatzSequenceSteps
On Error GoTo ErrorHandler 'エラー時に、アレイデータを出力させる対応
'シート上のデータクリア
ThisComponent.sheets(0).clearContents(511)'シート上のデータクリア
Dim N as Double
Dim colN as Long
Dim colSeq as Integer
Dim iRow as Long
Dim iCol as Integer
Dim nStt as Long
Dim nEnd as Long
Dim SttEnd as Long'nSttからnEndまでのカウント
Dim Count as Integer'計算回数=列数の取得
Dim colW as Integer
Dim nC as Long
Dim clrRow as Long
Dim cWrt as Long
'コラッツ数列開始値と終了値 s
nStt = 1 'nSttの値から、コラッツ数列を表示する
nEnd = 10000000 'nEndの値までの、コラッツ数列を表示する
'
nKai = 25 'nKai の回数に内に1になる数列をピックアップ
'
'数値を大きくしすぎるとOverFlowするので注意が必要。
'「if N mod 2 = 0 then」がOverFlowする。if N/2=0 then にしたら、表示位置がおかしくなった?。
'コラッツ数列開始値と終了値 e
Dim aryData() as Variant
Dim vL as Integer
Dim vT as Integer
Dim vR as Integer
Dim vB as Long
Dim mvR as Integer
Dim mvB as Integer
vL = 0
vT = 0
vR = nKai + 3 'Right メモリの番地確保?列数確保?
vB = (nEnd - nStt +3)'nKaiを700とかにして普通に数列を出す場合はこっち
'vB = 10000 '(vB - 1)行?
mvR = 0
mvB = 0
colW = 1
colN = colW
nC = 0
Count = 0
'セルデータのメモリへのコピー、つまり、aryDataのメモリ確保。
aryData = ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
iRow = 1
For SttEnd = nStt to nEnd
N = nStt + nC
colSeq = colN + 1
aryData(iRow)(colN) = N
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
if N = 1 then
Goto Continue1:'N=1の時に、「Do Until N = 1」を回避する
endif
Do Until N = 1
if colSeq = vR - 1 them
Exit Do
endif
Continue1:
if N - FIX(N / 2) * 2 = 0 then
N = N / 2
aryData(iRow)(colSeq) = N
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(colSeq + mvR, iRow + mvB).Value = N
else
N = 3 * N + 1
aryData(iRow)(colSeq) = N
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(colSeq + mvR, iRow + mvB).Value = N
endif
colSeq = colSeq + 1
Count = Count + 1
Loop
nC = nC + 1
aryData(iRow)(0) = Count
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPositon(0, iRow).Value = Count
Count = 0
if N <> 1 then
clrRow = 0
Do Until clrRow = vR
aryData(iRow)(clrRow) = ""
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(clrRow+mvR, iRow+mvB).Formula = ""
clrRow = clrRow + 1
Loop
else
iRow = iRow + 1
endif
Next SttEnd
ThisComponent.AddActionLock()
ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).setDataArray(aryData)
ThisComponent.removeActionLock()
Erase aryData
Exit Sub
ErrorHandler: 'エラーになった時に、エラーになるまでのアレイメモリのデータを出力する。
ThisComponent.AddActionLock()
ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).setDataArray(aryData)
ThisComponent.removeActionLock()
On Error Goto 0
End Sub
なぜ、コラッツ予想、3N+1問題の証明ができないのか?。たぶんそれは、すでに、体系化しているからではないのか?。数列を短い順に並べ替え、逆数列としてコラッツ数列を見ることによってそれがわかるだろう。
1を含んだ短い数列の先頭に数字を繋げる。その数字が奇数なのか、偶数なのか?。その数字が3の倍数なのか?合流値や分岐値なのか、分岐して、倍化して倍数列値になり、変形して約数列値になり、数列がどんどん長くなっていく。
整数という単独の数値の論理ではなく、数値の繋がりの体系論とかがあるのであれば、数値の繋がりの体系論という事で処理すべきだろう。
それは、コラッツ数列を値Nの順番に並べた一覧と、コラッツ数列の短い順に並べた一覧が一致することにより証明になるのではないのだろうか?どうなのだろう。ただ単に並べ替えただけだけど。
並べ替えることによって、その体系にする事ができ、元に戻すこともできる。
それによって、コラッツ数列が長くなるという事はどういう事なのかが見て取れる。
それにより、発散をせず、ループをせず、必ず1になる体系であるという事が見て取れる。それが証明になるのではないのだろうか?どうなのだろう。
しかし数学界は整数論として扱おうとしているのだろうから小難しい数式の記入がないものには証明のお墨付きは与えないのだろう。
などと思ってみたり。
Python3では、Integerに最大値がないようだ。という事は一億二千万の数字でコラッツ数列を出すならPython3で、計算して、計算表に出力すればよいという事になるのかな。
Python3での配列のアレイの操作を覚えるべきか?。
OverFlowでエラーになるので、N値だけセルに記入するようにしたら、遅くなった。
9時間かけて、エラーになる数字を突き止めた。ということにしておこう。8278015だ。
modの対策をしないとダメなようだ。
1(N/2)
55;/2...1
27;
9/2=4.5
9-(INT(4.5)*2)
9-(INT(9/2)*2)
N-(INT(N/2)*2) fix?
N-FIX(N/2)*2
前日の続き----------------------------------------------
10ステップめは、6個。それぞれが倍数列値になった。
3の倍数の12と84は、倍数列値で3の倍数の24と168になった。
奇数の13と85は、倍数列で偶数の26と170になった。
偶数の80と512は、倍数列値の偶数の分岐する値160と1024になった。
24; 12, 6, 3,10, 5,16,8,4,2,1
26; 13, 40, 20,10, 5,16,8,4,2,1
160; 80, 40, 20,10, 5,16,8,4,2,1
168; 84, 42, 21,64,32,16,8,4,2,1
170; 85,256,128,64,32,16,8,4,2,1
1024;512,256,128,64,32,16,8,4,2,1
11ステップめは、8個。
3の倍数の24と168は倍数列値で3の倍数の48と336になった。
偶数の26と170は倍数列値で偶数の分岐する値の52と340になった。
分岐値の160と1024は、約数列値で奇数の53と341、倍数列値で偶数の320と2048になった。
48; 24, 12, 6, 3,10, 5,16,8,4,2,1
52; 26, 13, 40, 20,10, 5,16,8,4,2,1
53; 160, 80, 40, 20,10, 5,16,8,4,2,1
320; 160, 80, 40, 20,10, 5,16,8,4,2,1
336; 168, 84, 42, 21,64,32,16,8,4,2,1
340; 170, 85,256,128,64,32,16,8,4,2,1
341;1024,512,256,128,64,32,16,8,4,2,1
2048;1024,512,256,128,64,32,16,8,4,2,1
12ステップめは数列が10。ここで5系統と32系統の一部がねじれ?編み込み?の様にずれ始めた。
3の倍数48と336は、倍数列値で3の倍数の96と672になった。
分岐値の52と340は、約数列値で奇数の17と113、倍数列値で偶数の104と680になった。
奇数の53と341は、倍数列値で偶数の分岐する値の106と682になった。
偶数の320と2048は、倍数列値で偶数の分岐する値の640と4096になった。
17; 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
96; 48, 24, 12, 6, 3,10, 5,16,8,4,2,1
104; 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
106; 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
113; 340, 170, 85,256,238,54,32,16,8,4,2,1
640; 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
672; 336, 168, 84, 42, 21,64,32,16,8,4,2,1
680; 340, 170, 85,256,128,64,32,16,8,4,2,1
682; 341,1024,512,256,128,64,32,16,8,4,2,1
4096;2048,1024,512,256,128,64,32,16,8,4,2,1
13ステップめは、数列が14。
3の倍数96と672は、倍数列値で3の倍数の192と1344になった。
奇数の17と113は、倍数列値で偶数の分岐する値の34と226になった。
偶数の104と680は、倍数列値で偶数の分岐する値の208と1360になった。
分岐値の106と682は、約数列値で奇数の35と227、倍数列値で偶数の212と1364になった。
分岐値の640と4096は、約数列値で3の倍数の213と1365、倍数列値で偶数の1280と8192になった。
34; 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
35; 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
192; 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
208; 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
212; 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
213; 640, 320, 160, 80, 40, 20,10, 5,16,8,4,3,1.
226; 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
227; 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
1280; 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
1344; 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
1360; 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
1364; 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
1365;4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
8192;4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
書き間違え等の確認の為に、右端にピリオドを打って確認することにした。
14ステップめは、数列が18。
3の倍数の192と1344は、倍数列値で3の倍数の384と2688になった。
分岐値の34と226は、約数列値で奇数の11と3の倍数の75、倍数列値で偶数の68と452になった。
分岐値の208と1360は、約数列値で3の倍数の69と453になり、倍数列値で偶数の416と2720になった。
奇数の35と227は、倍数列値で偶数の70と454になった。
偶数の212と1364は、倍数列値で偶数の分岐する値の424と2728になった。
3の倍数の213と1365は、倍数列値で3の倍数の426と2730になった。
偶数の1280と8192は、倍数列値で偶数の分岐する値の2560と16384になった。
11; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
68; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
69; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
70; 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
75; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
384; 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
416; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
424; 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
426; 213, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
452; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
453;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
454; 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2560;1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
2688;1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
2720;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
2728;1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2730;1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
16384;8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
分岐値のとは、約数列値で奇数のとになり、倍数列値で偶数のとになった。
2021年12月5日(日曜日)
nStt = 1, nEnd = 120000000, nKai = 30, vB = 100000で昨日から動かしているが、朝までには終わっていなかった。エラーにもなっていない
iRow = 3412, SttEnd = 21408597, CPUTime = 21:42:48 とか。とりあえず、if N mod 2 = 0 thenを修正した成果が出だという事なのだろう、Over Flowせずに、10000000を突破した。
2^27,134217728ってことは、nKai=30もいらないようだ。エラーになったら、今までのところまでを出力する方法が必要か?。もしくは、一定回数おきに出力させる方法を考えるべきか。
「Apache OpenOffice Wiki エラー処理」を参照した。
Sub
On Error GoTo ErrorHandler
Dim
通常のプログラムコード
On Error Goto 0
Exit Sub
ErrorHnadler:
エラーハンドラ用コード
Resume Next'エラー発生行の次の行にプログラム実行を戻して、処理を再開
ErrorHandler:
エラーハンドラ用コード
Resume Proceed
Proceed:
エラーハンドラ用コードを実行した後のプログラムの実行開始位置を指定
ErrorHnadler:
if Err = ExpectedErrorNo Then
else
end if
On Error Goto 0
Endsub
続き ---------------------------------------------------
14ステップめは、数列が18。
3の倍数の192と1344は、倍数列値で3の倍数の384と2688になった。
分岐値の34と226は、約数列値で奇数の11と3の倍数の75、倍数列値で偶数の68と452になった。
分岐値の208と1360は、約数列値で3の倍数の69と453になり、倍数列値で偶数の416と2720になった。
奇数の35と227は、倍数列値で偶数の分岐する値の70と454になった。
偶数の212と1364は、倍数列値で偶数の分岐する値の424と2728になった。
3の倍数の213と1365は、倍数列値で3の倍数の426と2730になった。
偶数の1280と8192は、倍数列値で偶数の分岐する値の2560と16384になった。
11; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
68; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
69; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
70; 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
75; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
384; 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
416; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
424; 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
426; 213, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
452; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
453;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
454; 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2560;1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
2688;1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
2720;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
2728;1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2730;1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
16384;8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
15ステップめは、数列が24。
3の倍数の384と2688は、倍数列値で偶数の768と5376になった。
奇数の11と3の倍数の75は、倍数列値で偶数の分岐する値22と分岐しない3の倍数150になった。
偶数の68と452は、倍数列値で偶数の分岐する値の136と904になった。
3の倍数の69と453は、倍数列値で偶数の138と906になった。
偶数の416と2720は、倍数列値で偶数の分岐する値の832と5440になった。
分岐値の70と454は、約数列値で奇数の23と151になり、倍数列値で偶数の140と908になった。
分岐値の424と2728は、約数列値で奇数の141と909になり、倍数列値で偶数の848と5456になった。
3の倍数の426と2730は、倍数列値で偶数の852と5460になった。
分岐値の2560と16384は、約数列値で奇数の853と5461になり、倍数列値で偶数の5120と32768になった。
(注意:奇数の11と75は、倍数列値で偶数の分岐する値22と分岐しない150になった。)
22; 11, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
23; 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
136; 68, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
138; 69, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
140; 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
141; 424, 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
150; 75, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
151; 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
768; 384, 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
832; 416, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
848; 424, 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
852; 426, 213, 460, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
853; 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
904; 452, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
906; 453,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
908; 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
909; 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
5120; 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
5376; 2688,1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
5440; 2720,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
5456; 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
5460; 2730,1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
5461;16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
32768;16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
16ステップめは、数列が29。奇数になった?。
3の倍数の768と5376は、倍数列値で3の倍数の536と10752になった。
分岐値22は、約数列値で奇数の7、倍数列値で偶数の44になった。
3の倍数150は、倍数列値で3の倍数の300になった。
7; 22, 11, 34, 17, 52, 25, 13, 40, 20,10, 5,16,8,4,2,1
44; 22, 11, 34, 17, 52, 25, 13, 40, 20,10, 5,16,8,4,2,1
45; 136, 58, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
46; 23, 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
272; 136, 68, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
276; 138, 69, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
277; 832, 416, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
280; 140, 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
282; 141, 424, 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
300; 150, 75, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1
301; 904, 452, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1
302; 151, 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
1536; 768, 384, 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1
1664; 832, 416, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
1696; 848, 424, 212, 106, 52, 160, 80, 40, 20,10, 5,16,8,4,2,1
1704; 852, 426, 213, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
1706; 853, 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
1808; 904, 452, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1
1812; 906, 453,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1
1813; 5440, 2720,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1
1816; 908, 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
1818; 909, 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
10240; 5120, 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
10752; 5376, 2688,1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1
10880; 5440, 2720,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1
10912; 5456, 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
10920; 5460, 2730,1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
10922; 5461,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
65536;32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
分岐値のとは、約数列値で奇数のとになり、倍数列値で偶数のとになった。
このような事をやっていて、証明はどのようにするのか?想像はできるだろうか?。
その方法が正しいのかどうかはわからないけど。
コラッツ数列
Nが奇数なら、3 * N + 1 = G
Nが偶数なら、N / 2 = K
逆数列
奇数なら、
N = K * 2
G = K * 2
偶数なら、
N = G * 2
G = G * 2
偶数なら、
K = ( G - 1 ) / 3
----------------------------------------------
・地震が起きるの8℃おき?2℃、10℃、18℃、26℃、34℃、42℃、50℃。2段階下がると起きやすくなる感じ?。気温が下がってくるときの26℃が地震が起きやすい温度帯か?。
2010年のワシントンやニューヨークで起きた震度4の地震が良い例になるかもしれない。100年ぶりの42℃を記録。その後、気温が下がってから地震が起きた。
地震を起こすためのトリガー。そのトリガーに加わる複数の力。最終的にどの力が増加してトリガーを引くのか?
地震を起こすためのトリガーに加わっている力。その力が変化するときに自然界ではどのような変化が起きているのか?その自然界での変化をとらえることにより地震を起こすためのトリガーに加わっている力の加減を知ることは可能なのだろうか?
功名心と利益の為に暴走する人々か?
カネや権力や既得権益関係者が関わって民主主義の名の下に世論や政治家が作られる?
そこにカネを出すスポンサー企業達。
それをまとめる大物プロデューサー達。
・データマイニングのやり方って、「事実を元にシナリオを描き、そのシナリオを検証する」?でいいんだっけ?事実を元にシナリオを描き、そのシナリオを検証する→意外と大事だよ。相場にも使えるかも、ははは、使えなかったりして...。シナリオ=妄想?、俺って適任?。
----------------------------------------------
2021年11月29日(月曜日)
LibreOffice Calcでマクロが記入できるところが複数ある感じ。
LibreOfficeのセキュリティの関係で、シートにはマクロのモジュールを紐づけできないようにしてある感じ。セキュリティの設定を下げると紐づけできるようだが、それだと、外部から来たファイルで、ウィルス感染なんてことになる可能性も有るのでセキュリティは下げられない。
マクロをいろいろいじっていて大した成果はなかった。メモリ上のArrayとセルの位置関係や、セルの二次元配列についての位置関係などいろいろパラメータを変更してコラッツ数列の一部を表示したりしていた。とりあえず、回数をカウントして値Nの左に表示してソートさせる様な環境にはなったが、1行目をどのように扱うか?。計算回数を表示するようにしたら、ソートしたらどこかに紛れ込んだので、一行目は空白行にしておくことにした。
セルに組み込み関数を使って数列を表示できるようにしてあるが、その行を100000行*32列までふやしていたのだが、ソートをしようとすると、ソート対象の上側に、行を連続してパラメータ用のセルを設定してあったのだが、そのパラメータのセルまでソート対象範囲が拡大したので、一行だけ上にドラッグしてずらしたら、完了するまでに2時間かかった。
2021年11月30日(火曜日)
相変わらず1000000行まで、arrayを使ってメインメモリで処理をしようとするとメモリ不足で落ちる。
このコードを書いた時に、目視用のコードも併記していたので、arrayメモリを使わずに、セルへ直接書き込んだらどうなるのか?。
メモリ不足でLibreが落ちると、メインメモリは解放されるが、スワップメモリが解放されないので、後の作業に影響を与えるのでリブートが必要になり、めんどくさい。
arrayを使わない方法だとメモリ消費がほとんど増えない。メモリ42%で、スワップも発生しない。しかし時間がかかる。セルに組み込み関数を設定した場合と変わらないくらいの時間がかかるのだろうか?どうなのだろう。あとは、ファイルのサイズがどれだけ減るのか?。半分くらいになっていればいいかなくらいの感じか。
結果が出るのを待っている間、こっちにコードを控えておくか。大量にメモリを消費してない分、コードのエリアも普通にスクロールできる。arrayでメモリを使っていた時は、スクロールもできなかった。
一時間で、約二十万行、わぉ、五時間コースになりそうだ。
Sub CollatzSequences
' Sheets(0)のデータの削除
thisComponent.Sheets(0).clearContents(511) ' Sheets(0)のデータの削除
' thisComponont.AddActionLock() '表示の停止?
Dim N As Long '値N
Dim colN As Long '値Nの列を指定する?
Dim colW As Integer '値Nの左側に作業用の列を確保
Dim colSeq As Integer '数列の列を指定する
Dim Count As Integer '計算回数、つまり数列の値の数、数列の長さ。
'メインメモリ配列用start
Dim aryData() As Integer
Dim vL As Integer 'Left
Dim vT As Integer 'Top
Dim vR As Integer 'Right
Dim vB As Integer 'Bottom
'getCellRangeByPosition(left, top, right, bottom)
vL = 0
vT = 0
vR = 25 ' 列数の指定
vB = 50 ' 行数の指定 = 値の指定。(値は-1された値まで調べる?)
'メインメモリ配列用end
' aryData メインメモリ使用。セルの値をメモリへ読み込む。
' 読み込む前に、セルのデータを消しておくこと。
'aryData = thisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
Dim IRow As Long, iCol As Integer
iRow = 0
colW = 1
Count = 0
colN = colW
For iRow = 1 to vB - 1
N = iRow
colSeq = colN + 1
thisComponent.Sheets(0).getCellByPosition(colN, iRow ).Value = N '目視用、セル書
' aryData(iRow)(colN) = N 'メインメモリ書き込み用
if N = 1 then
goto continue1:
endif
Do until N = 1
if colSeq = vR - 1 then
exit Do
endif
continue1:
if N mod 2 = 0 then
N = N / 2
thisComponent.Sheets(0).getCellByPosition(colSeq, iRow).Value = N '目視用セル書
' aryData(iRow)(colSeq) = N'メインメモリ書き込み用
else
N = 3 * N + 1
thisComponent.Sheets(0).getCellByPosition(colSeq, iRow).Value = N '目視用セル書
' aryData(iRow)(colSeq) = N'メインメモリ書き込み用
endif
colSeq = colSeq + 1
Count = Count + 1
loop
if iRow = 0 then
Count = ""
endif
thisComponent.Sheets(0).getCellByPosition(0, iRow).Value = Count '目視用セル書
' aryData(iRow)(0) = Count 'メインメモリ書き込み用
Count = 0
next iRow
' thisComponent.Sheets(0).clearContents(511)
' thisComponent.AddActionLock()
' thisComopnent.Sheets(0).getCellRangeByPosition(vL, vT, vR, vB).setDataArray(aryData)
thisComponent.removeActionLock()
erase aryData
End sub
時間かかりすぎ。
500000ぐらいで区切って複数回をつなぎ合わせる感じにすれは1000000行以上も可能か?。
必要とする情報を、必要とするときに、必要とする場所で。
Countを利用して、数列の長さで区切りをつけて検証する列数以内の、計算回数の数列だけをarrayメモリに記入するようにすればよいのか?。それにより、長い数列の値Nを除けて、メモリ使用量が減る。
そもそも、このマクロを作ったのは、22列くらいまでの数列を並び替えて、どういうふうに見えるのか、どういうふうに見ることができるのかを調べようとして作ったもの。すべての値は必要ない、数列が特定の長さより短いものだけを、arrayに記憶すべき。
あとは、セルへの組み込み関数を使ったファイルとのサイズの比較。
とりあえず、6時間20分ぐらいかかった感じ。で、いったん上書き保存をして、通常終了させて、保存って感じ。保存前のサイズが、7.5KB、保存後が、おい、なんだそれ、145.6MBだと。とりあえず正常終了させるとするか。組み込み関数のファイルよりも大きいってことは?どちらかの行数を間違えている可能性あり。
やっぱ数え間違いだった。組み込み関数の方が100000行*32列だった。一ケタ少なかった。
組み込み関数の100000行のソートに約15分かかった。
1000000行*31行、145.6MBのファイルで起動に約10分かかった。ソートしようとしたが、ソートの画面が出てくるのに約10分、そこから。メインメモリが足りなくなりスワップファイルの消費が増えた。
ソートキー選択まで15分くらいかかった。OKボタンを押してしばらくしたら、Calcが落ちた。メモリ不足だ。やはり、列数でふるいにかけないとだめなようだ。とりあえず、1からではなく途中の数字からコラッツ数列を出せるようにしたやつがあるので、そいつで、列数でふるいにかけるコードを作る必要あり?。
メモリーの動的確保とかも考えておく必要あり?。
行に数列を書き出す。iRow, Count
列数が22未満なら、そのまま残す。Count
列数が22以上なら、その行に上書き。Count, iRow
2021年12月1日(水曜日)
上のマクロをエクセルに貼りつけてみたら、表現方法の違いで、thisComponentとかがはじかれる。
とりあえず、任意の位置からコラッツ数列を表示するコードに計算回数、数列の長さを表示できるようにする。上のマクロを参照しながら。
.getDataArray()で、メモリを確保しなくてもよいだろうと思って、「'」でコメント扱いに変更してから動作確認せずに、回数の算出を組み込み初め、動作確認しようとしたら、Index out of defined rangeのメッセージ。新たに記入したコードを削除したが状況変わらず、で、メモリの確保?の件を思い出し、元に戻して一件落着。
とりあえず、Countの表示までできた。
行に数列を書き出す。iRow, Count, colSeq
列数が22未満なら、そのまま残す。Count, colSeq, vR
列数が22以上なら、その行に上書き。Count, iRow, colSeq, vR
行に数列を書き出す。iRow, Count, colSeq
' 列数が22未満なら、そのまま残す。Count, colSeq, vR
列数が、vRに達した時点、もしくはループを抜けた時点でNが1になっていたら残す。
列数が22以上なら、その行に上書き。Count, iRow, colSeq, vR
上書きだと、arrayの末尾の方で前のデータが残る可能性がある。その行のクリアが必要。
iRowを、next iRowで一増やした後に、一減らして、同じ行を使う仕組みが必要。
行に数列を書き出す。iRow, Count, colSeq
列数が、vRに達した時点、もしくはループを抜けた時点でNが1になっていたら行を残す。
列数が22以上なら、その行のクリア。
または、ループを抜けた時点でNが1になっていなければその行をクリア。
iRowからクリアした回数を引くカウント、clrRowに、+1。
iRow + 1 された後に、iRow - clrRow する。
全体を回している?値Nを順番どおりに処理するための?iRowに変更を加えるとおかしくなるのでiRowに変更は加えずに、書き込む行の専用カウンターを用意すべき?。
ループを抜けた時にN=1ならば、書き込む行を、+1し、N<>1ならば、+1しない。
書き込みのアドレスにiRowを使っているので変更箇所が多すぎる。書き込みアドレスはiRowのままにして、全体を回しているカウント名の方を変更すればよい?。SttEnd
Do until clrRow = vR
thisComponent.Sheets(0).getCellByPosition(clrRow, iRow).Value = ""
sryData(iRow)(clrRow) = ""
clrRow = clrRow + 1
loop
の、コードでクリアしようとすると、シートのセルに数字の0が入る。arrayメモリからセルに書き出した時は表示無し。Value="" ではなく、NullとかEmptyとかを指定しないとダメか?。デバッグで気になるだけだから無視してもよいのかもしれない。ただ、計算速度に影響があるのかどうかがわからない。
とりあえず、値100くらいまでの値で、数列が20以内の数列だけを表示することができた。その数列に、メニューのData > Sort で、カウントとN値を指定したら、欲しいものができた。
1000000でやる前に正常終了させて、マシンのリブート。
19;524288,262144,131072,65536,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
この数列が270行目。
1050000で19列だと270行。
300000000だと32列で何行なのか?。
結果が出るまでのひまつぶしにタイピング練習も兼ねて、コードをここへ入力。
追加と変更で、関係ない変数もそのまま記入する。
sub getArrayDataAndSet
thisComponent.Sheets(0).clearContents(511)
thisComponent.AddActionLock()
Dim N As Long
Dim colN As Long
Dim colSeq As Integer
Dim iRow As Long
Dim iCol As Integer
Dim nStt As Long
Dim nEnd As Long
Dim SttEnd As Long
Dim Count As Integer
Dim colW As Integer
Dim nC As Long
Dim clrRow As Long
'コラッツ数列開始値と終了値s
nStt = 1 '開始する値
nEnd = 100000000 '終了する値
'コラッツ数列開始値と終了値e
'arrayメインメモリへの操作?s
Dim aryData() As Variant
Dim vL As Integer
Dim vT As Integer
Dim vR As Integer
Dim vB As Integer
Dim mvR As Integer
Dim mvB As Integer
vL = 0
vT = 0
vR = 30
vB = nEnd - nStt + 2
' vB = 100000000 '場合によってはこっち
'arrayメインメモリへの操作?e
Dim mMemR As Integer
Dim mMemB As Integer
mvR = 0
mvB = 0
colW = 1
colN = colW
nC = 0
Count = 0
arydata = thisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
'arydata = thisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB/10000).getDataArray()
'(vL,vT,vR,vB/10000)は、数列の短いものの表示には使用メモリを減らせる。
iRow = 1
For SttEnd = 1 to vB -1
N = nStt + nC
colSeq = colN + 1 '値Nと数列の位置関係
thisComponent.Sheets(0).getCellByPosition(colN + mvR , iRow + mvB).Value = N
aryData(iRow)(conN) = N
if N = 1 then
Goto Continue1:
endif
Do until N = 1
if colSeq = vR -1 then
exit Do
endif
Continue1:
if N mod 2 = 0 then
N = N / 2
thisComponent.Sheets(0).getCellByPosition(colSeq + mvR , iRow + mvB).Value = N
aryData(iRow)(colSeq) = N
else
N = 3 * N + 1
thisComponent.Sheets(0).getCellByPosition(colSeq + mvR , iRow + mvB).Value = N
aryData(iRow)(colSeq) = N
endif
colSeq = colSeq + 1
Count = Count + 1
Loop
nC = nC + 1
thisComponent.Sheets(0).getCellByPosition(0 , iRow).Value = Count
aryData(iRow)(0) = Count
Count = 0
if N <> then
clrRow = 0
Do Until clrRow = vR
thisComponent.Sheets(0).getCeelByPosition(clrRow + mvR,iRow + mvB).Value = ""
aryData(iRow)(clrRow) = ""
clrRow = clrRow + 1
Loop
else
iRow = iRow +1
endif
next SttEnd
thisComponent.AddActionLock()
thisComponent.Sheets(0).clearContents(511)
thisComponent.Sheets(0).getCellRangeByPosition(vL, vT, vR, vB).setDataArray(aryData)
thisComponent.removeActionLock()
Erase aryData
End sub
一部表示がながくなるので使っていない位置変更用の変数mvRとmvBを削除した。
(vL + mvR, vT + mvB, vR + mvR, vB+mvB).setDataArray(aryData)
120,000,000行*22列
1,000,000行で22列以下?未満?が544行くらいで約20分。
20*120 = 2400
2400/60 = 40時間って...。
120Mもいらなかった。
1000000*24
とりあえず10,000,000行の24列で8388608を得る予定。2^23
約10分でSttEndが415494
約1時間後、値SttEndが2542053で、iRowが856。4時間コースか。
数列が1にならなかったものを消している時間が無駄だったか?。アクセス回数がほぼ二倍になっている?。消さずにメモリを消費させるべきだったか?。
20:30で、6078190の867。 cpu time 4:23:00 もしかして、数字が大きくなってきたからその分計算時間が増えている感じかな?。
21:00で、7544935の867。cpu time 4:55:02 iRowが867で変わらずってことは、もしかして残りは8388608だけか?
21:20頃、overfllowで落ちた。式の、N = 3 * N + 1が反転していた。
arrayを使わずに、ThisComponent.AddActionLock()だけで乗り切れるか?。
セルに書き出しながら進めていく方でclrRowのポジションを使用している式でValue
thisComponent.Sheets(0).getCeelByPosition(clrRow + mvR,iRow + mvB).Value = ""
thisComponent.Sheets(0).getCeelByPosition(clrRow + mvR,iRow + mvB).Formula = "" に変更したら、空白のセル表示になってくれた。
メインメモリのエリアを確保した場合、何かのエラーになった時に、セルに書き出すことができない。エラーの事を考えるならば、セルに書き出したほうがよい?どうなのだろう。
2021年12月2日(木曜日)
09:34 2021/12/02
まいった、まだおわってない。SttEnd=1626281,iRow=855,CPUTime=11:08:51
寝る前に計算させたまま放置して朝には終わっているだろうと思っていたがまだ終わっていない。
解決策として、折衷案というかハイブリッドというか、arrayで計算して、10万行おきにセルに出力する事を繰り返して大きな数字までたどり着くようにしないと厳しい感じ。
とりあえず、1048576はこえているようなので、いつ終了してもいいかなって感じではあるが、2097152まで、待ってみるか。
10:38 2021/12/02
SttEnd=1779530, iRow=855, CPUTime=12:09:37
変数の、mvBにセルへの書き出し用のアドレスを持たせる?。
iRowと100000を比較し、100000ならば、arrayからcellへ書き出し、
そういえば、hisComponent.AddActionLock()が解除されてるような感じだが、どのタイミングで解除されるのか?。
数列を出す作業をアレイでおこなって、1になったらセルに書き出し、0行目の空白行を読み込んでリセットの繰り返し?
11:51 2021/12/02
iRow=855, SttEnd=1963565, CPUTime=13;23;27 で、iRowの値が変わらない。
12:43 2021/12/02
iRow=855, SttEnd=2094026, CPUTime=14:15:34
12:46 2021/12/02
iRow=856を確認。2097152も確認した。
14:42 2021/12/02
iRow=856, SttEnd=2385262, CPUTime=16:15:19
この辺でやめて、改良を始めるか。61.5KBが、69.0KB
17:55 2021/12/02
とりあえず、アレイメモリ上の配列行を一万くらいで、値は一から一千万くらいまででとりあえず動かしている。
iRow = 656, SttEnd = 250400, CPUTime = 05:27:39 で、暇つぶしのコード入力練習?バックアップと一覧表示による考察?
あ、今頃重要な事を思い出した。メインメモリの読み書きを頻繁に行うとメインメモリが劣化する。
Sub GetArrayDataAndSet
'まずはシートの内容を消す。
ThisComponent.Sheets(0).clearContents(511) 'シートの内容を消す。
' ThisComponent.AddActionLock() '作業エリアがアレイメモリなので今回はロックしないで実行。
Dim N as Long '計算用の値N
Dim colN as Long 'Nを表示する列、通常0 + colW。
Dim colSeq as Integer '数列の列のアドレス
Dim iRow as Long '行のアドレス
Dim iCol as Integer '
Dim nStt as Long '算出する数列の為の最初の値
Dim nEnd as Long '算出する数列の為の最後の値
Dim SttEnd as Long 'nSttからnEndまでのカウンター
Dim nC as Long 'Nのカウント上げ用
Dim clrRow as Long '1にならなかった数列がある最終行を消すためのアドレス
Dim colW as Long '値Nの左側にCount等の表示列確保
Dim Count as Integer '計算回数、ステップ数、列の数。
'コラッツ数列開始値と終了値s
nStt = 1
nEnd = 10000000
'
nKai = 23 'nKaiの回数以内に1になる数列をピックアップ
'nKai表示する数列の値と、最大計算回数を考慮して指定する。320、600
'コラッツ数列開始値と終了値e
'arrayメインメモリへの操作?s
Dim aryData() as Variant
Dim vL as Integer
Dim vT as Integer
Dim vR as Integer
Dim vB as Long
Dim mvR as Integer
Dim mvB as Long
'getCellRangeByPosition(left, top, right, bottom)
vL = 0
vT = 0
vR = nKai + 3 'colW=1, N, vRの右端、の三列分余計に確保。
vB = 10000
' vB: arrayのメインメモリ上の確保する行数。大きすぎるとメモリ不足になり落ちる。
' vB: 大きすぎるとメモリ不足になり落ちる。
' vB: 通常のコラッツ数列、vB = nEnd - nStt + 3 かな?vR
'arrayメインメモリへの操作?e
Dim mMemR as Integer
Dim mMemB as Integer
mvR = 0
mvB = 0
colW = 1
colN = colW
nC = 0
Count = 0
'aryDataのメモリ確保?
aryData = ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
iRow = 1
' For iRow = 1 to vB -1
' For SttEnd = 1 to nEnd - 1 'overflowの原因初期値が1
' For SttEnd = nStt to nEnd - 1 ' アレイではないので-1は不要。
For SttEnd = nStt to nEnd
N = nStt + nC
colSeq = colN + a
aryData(iRow)(colN) = N '値Nのアレイメモリへの記入
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
if N = 1 then
Goto Continue1:
endif
Do Until N = 1
if colSeq = vR - 1 then
Exit Do
endif
Continue1:
if N mod 2 = 0 then
N = N / 2
aryData(iRow)(colSeq) = N
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
else
N = 3 * N + 1
aryData(iRow)(colSeq) = N
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
endif
colSeq = colSeq + 1
Count = Count + 1
Loop
nC = nC + 1
aryData(iRow)(0) = Count
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(0, iRow).Value = Count
Count = 0
if N <> 1 then
clrRow = 0
Do Until clrRow = vR
aryData(iRow)(clrRow)= ""
' getCellByPositionで、直接セルに出力する、目視用。
' ThisComponent.Sheets(0).getCellByPosition(clrRow + mvR , iRow + mvB).Formula = ""
clrRow = clrRow + 1
Loop
else
iRow = iRow + 1
endif
next SttEnd
' ThisComponent.Sheets(0).clearContents(511)
ThisComponent.AddActionLock()
ThisComponent.Sheets(0).getCellRangeByPosition(vL + mvR, vT + mvB, vR + mvR,vB + mvB).setDataArray(aryData)
ThisComponent.removeActionLock()
' Erase aryData
End Sub
18:14 2021/12/02 iRow = 676, SttEnd = 1000419 CPUTime = 20:57.52
18:34 2021/12/02 iRow = 687, SttEnd = 1908710 CPUTime = 40:03.69
18:54 2021/12/02 iRow = 688, SttEnd = 2874242 CPUTime = 1:00:20
19:16 2021/12/02 iRow = 688, SttEnd = 3950607 CPUTime = 1:22:41
19:24 2021/12/02 iRow = 689, SttEnd = 4298143 CPUTime = 1:30:04
朝方の時とiRowが少ないなと思ったら、vRが23+3=26だった。前日からの分ではvR=30で27回以下のピックアップだった。
19:58 2021/12/02 iRow = 689, SttEnd = 5918585 CPUTime2:03:56
20:49 2021/12/02 CPUTime = 2:53:15 OverFlow でエラーになった。「N = 3 * N + 1」が反転していた。
やはり、途中でメインメモリからセルに書き出すようにしないとダメなようだ。
それと、たぶん終了時に
' For SttEnd = 1 to nEnd - 1 'たぶんOverflowの原因は、初期値が1。nSttに変更。
For SttEnd = nStt to nEnd -1
nEndを100、vBを10にした場合どのようなエラーになるのか?。
Error:
Inadmissible value or datatype.
Index out of defined range.
nEnd が100なのに、Nが99で終わる。
「 For SttEnd = nStt to nEnd -1」の -1 をコメント化
For SttEnd = nStt to nEnd '-1
一から百までを、メインメモリに10溜まったらセルに書き出し、メインメモリをクリアして、また、メインメモリに10溜まったらセルの続きに書き出す、これを繰り返す?。
2021年12月3日(金曜日)
OverFlow。寝る前に1から120000000までの30列、実質27列で数列をアレイメモリを使って抜き出していたが、落ちていたようだ。大きな数字を使う場合は最大値を使ったテストをしてから本番開始すべき。開始を1から119999990にして動かしたら、Error:Inadmissible value or data type. OverFlow.
Long では足りなかったようだ。1025156249 * 3 = 3075468747で、Long型の2147483647を越えた為にOverFlowしたもよう。
Dim N as Double
に、してみたら、またOverFlow。
式が、if N mod 2 = 0 then のところで止まった。
if N / 2 = 0 then
に、してみたら計算は正常終了した感じ。
nStt=119999990, nEnd=120000000で700列、vB=100000で実行したら、スワップ発生。メインメモリ、スワップメモリともに100%近くのところまできて、処理が重くなった。CPU使用率は30%くらいなので、計算のところまでたどり着いてない感じ。で、結局落ちた。保存してなかったので変更箇所が元に戻っている。まぁ、元に戻す手間が減ったと思えばラッキーかな。
で、N as doubleにして、if N / 2 = 0 thenにして、nStt=119999990、nEnd=120000000、nKai=730、vB=100で実行したらまたオーバー不老じゃなくて、Over Flow。
$$$$$$$$$$2021/12/05追記。
if N / 2 = 0 then って、0になるNは2だけだろ。今頃気が付いた。
$$$$$$$$$$2021/12/05追記。
119999990が、開始のNで、
5165606111056150に、16回目ぐらいでなって、そのあとからE+016の記号がついて、
1.54968183331685E+016に、17回目ぐらいでなって、
1.54330026348752E+308に、629回目ぐらいでなって、Over Flowでおちた。
この状態で、1から10までを表示しようとしたら、表示できなかった。
if N / 2 = 0 thenを元の、if N mod 2 = 0 thenに戻したら、表示された。
mod演算子がLong型の為、modでOver Flowが起きるもよう。コンピュータの限界を越えようとしても限界はあるので、この辺であきらめるか。
「一から百までを、メインメモリに10溜まったらセルに書き出し、メインメモリをクリアして、また、メインメモリに10溜まったらセルの続きに書き出す、これを繰り返す。」
これも考えるのはやめておこう。
コラッツ予想 3N+1問題を拡張し、aN+b問題として考えると、
計算の成分にマイナスが入り込むために絶対値がゼロ側にずれるために過去の値とぶつかりループする。その判例として3N+1を示す?ちょっと違うか?。
aN+bでは必ず、1000以下?100以下?の値でループが発生し、大きな数値もそのループを引き継いでいる。ループが起きない場合はどのような場合か、判例として3N+1を示す?
1ステップめは、1個。
2;1
2ステップめは、1個。
偶数2が倍数列値で偶数の分岐する値の4になった。
4;2,1
3ステップめは、2個。
分岐値が約数列値で奇数の1と倍数列値で偶数の8に分かれた。
1;4,2,1
8;4,2,1
4ステップめは、1個。ここから始まる感じ。
偶数の8が、倍数列値で偶数の分岐する値の16になった。
16;8,4,2,1
5ステップめは、2個。
分岐値16が、約数列値で奇数の5と、倍数列値で偶数の32に分岐した。
5;16,8,4,2,1
32;16,8,4,2,1
6ステップめは、2個。
奇数5が、倍数列値で偶数の分岐する値の10になった。
偶数32が、倍数列値で偶数の分岐する値の64になった。
10; 5,16,8,4,2,1
64;32,16,8,4,2,1
7ステップめは、4個。
分岐値10が約数列値で奇数の3と倍数列値の偶数の20に分岐した。
分岐値64が約数列値で奇数の21と倍数列値の偶数の128に分岐した。
3;10, 5,16,8,4,2,1
20;10, 5,16,8,4,2,1
21;64,32,16,8,4,2,1
128;64,32,16,8,4,2,1
8ステップめは、4個。
3の倍数で奇数の3と21が、倍数列値で3の倍数の6と42になった。
偶数の20と128が倍数列値で偶数の分岐する値の40と256になった。
6; 3,10, 5,16,8,4,2,1
40; 20,10, 5,16,8,4,2,1
42; 21,64,32,16,8,4,2,1
256;128,64,32,16,8,4,2,1
接続点?合流点?、接続値?合流値?。どの呼び方が良いのだろうか?。
接続と切断?ここでは切断はない。合流と分岐?コラッツ数列では合流点になるが、逆数列だと分岐点になる。それを考えると、合流と分岐を使うべきだろう。
逆数列の場合、合流値になると約数列と倍数列に分岐する。新たな定義の確定?。
逆数列として説明しているので、合流値ではなく分岐値と言うことにする。
コラッツ数列:3N+1:N/2:では、合流値もしくは分岐値は、(N-1)/3の整数のみ。
ここの文言の上の各ステップの説明も書き直し。
これ以降、下降数列16の8からの部分数列の記入は省略することにする?。しない。
9ステップめは、6個。
3の倍数の6と42は倍数列値で3の倍数の12と84になった。
分岐値の40と256は、約数列値で奇数の13と85、倍数列値で偶数の80と512に分岐した。
12; 6, 3,10, 5,16,8,4,2,1
13; 40, 20,10, 5,16,8,4,2,1
80; 40, 20,10, 5,16,8,4,2,1
84; 42, 21,64,32,16,8,4,2,1
85;256,128,64,32,16,8,4,2,1
512;256,128,64,32,16,8,4,2,1
10ステップめは、6個。それぞれが倍数列値になった。
3の倍数の12と84は、倍数列値で3の倍数の24と168になった。
奇数の13と85は、倍数列で偶数の26と170になった。
偶数の80と512は、倍数列値の偶数の分岐する値160と1024になった。
24; 12, 6, 3,10, 5,16,8,4,2,1
26; 13, 40, 20,10, 5,16,8,4,2,1
160; 80, 40, 20,10, 5,16,8,4,2,1
168; 84, 42, 21,64,32,16,8,4,2,1
170; 85,256,128,64,32,16,8,4,2,1
1024;512,256,128,64,32,16,8,4,2,1
11ステップめは、8個。
3の倍数の24と168は倍数列値で3の倍数の48と336になった。
偶数の26と170は倍数列値で偶数の分岐する値の52と340になった。
分岐値の160と1024は、約数列値で奇数の53と341、倍数列値で偶数の320と2048に分岐した。
48; 24, 12, 6, 3,10, 5,16,8,4,2,1
52; 26, 13, 40, 20,10, 5,16,8,4,2,1
53; 160, 80, 40, 20,10, 5,16,8,4,2,1
320; 160, 80, 40, 20,10, 5,16,8,4,2,1
336; 168, 84, 42, 21,64,32,16,8,4,2,1
340; 170, 85,256,128,64,32,16,8,4,2,1
341;1024,512,256,128,64,32,16,8,4,2,1
2048;1024,512,256,128,64,32,16,8,4,2,1
2021年12月4日(土曜日)
素人の、つぎはぎだらけのコード。
全角の空白文字が入っているとエラーが出る。
Sub CollatzSequenceSteps
On Error GoTo ErrorHandler 'エラー時に、アレイデータを出力させる対応
'シート上のデータクリア
ThisComponent.sheets(0).clearContents(511)'シート上のデータクリア
Dim N as Double
Dim colN as Long
Dim colSeq as Integer
Dim iRow as Long
Dim iCol as Integer
Dim nStt as Long
Dim nEnd as Long
Dim SttEnd as Long'nSttからnEndまでのカウント
Dim Count as Integer'計算回数=列数の取得
Dim colW as Integer
Dim nC as Long
Dim clrRow as Long
Dim cWrt as Long
'コラッツ数列開始値と終了値 s
nStt = 1 'nSttの値から、コラッツ数列を表示する
nEnd = 10000000 'nEndの値までの、コラッツ数列を表示する
'
nKai = 25 'nKai の回数に内に1になる数列をピックアップ
'
'数値を大きくしすぎるとOverFlowするので注意が必要。
'「if N mod 2 = 0 then」がOverFlowする。if N/2=0 then にしたら、表示位置がおかしくなった?。
'コラッツ数列開始値と終了値 e
Dim aryData() as Variant
Dim vL as Integer
Dim vT as Integer
Dim vR as Integer
Dim vB as Long
Dim mvR as Integer
Dim mvB as Integer
vL = 0
vT = 0
vR = nKai + 3 'Right メモリの番地確保?列数確保?
vB = (nEnd - nStt +3)'nKaiを700とかにして普通に数列を出す場合はこっち
'vB = 10000 '(vB - 1)行?
mvR = 0
mvB = 0
colW = 1
colN = colW
nC = 0
Count = 0
'セルデータのメモリへのコピー、つまり、aryDataのメモリ確保。
aryData = ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()
iRow = 1
For SttEnd = nStt to nEnd
N = nStt + nC
colSeq = colN + 1
aryData(iRow)(colN) = N
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(colN + mvR, iRow + mvB).Value = N
if N = 1 then
Goto Continue1:'N=1の時に、「Do Until N = 1」を回避する
endif
Do Until N = 1
if colSeq = vR - 1 them
Exit Do
endif
Continue1:
if N - FIX(N / 2) * 2 = 0 then
N = N / 2
aryData(iRow)(colSeq) = N
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(colSeq + mvR, iRow + mvB).Value = N
else
N = 3 * N + 1
aryData(iRow)(colSeq) = N
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(colSeq + mvR, iRow + mvB).Value = N
endif
colSeq = colSeq + 1
Count = Count + 1
Loop
nC = nC + 1
aryData(iRow)(0) = Count
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPositon(0, iRow).Value = Count
Count = 0
if N <> 1 then
clrRow = 0
Do Until clrRow = vR
aryData(iRow)(clrRow) = ""
' 'getCellByPositionで、直接セルに記入する目視用
'ThisComponent.Sheets(0).getCellByPosition(clrRow+mvR, iRow+mvB).Formula = ""
clrRow = clrRow + 1
Loop
else
iRow = iRow + 1
endif
Next SttEnd
ThisComponent.AddActionLock()
ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).setDataArray(aryData)
ThisComponent.removeActionLock()
Erase aryData
Exit Sub
ErrorHandler: 'エラーになった時に、エラーになるまでのアレイメモリのデータを出力する。
ThisComponent.AddActionLock()
ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).setDataArray(aryData)
ThisComponent.removeActionLock()
On Error Goto 0
End Sub
なぜ、コラッツ予想、3N+1問題の証明ができないのか?。たぶんそれは、すでに、体系化しているからではないのか?。数列を短い順に並べ替え、逆数列としてコラッツ数列を見ることによってそれがわかるだろう。
1を含んだ短い数列の先頭に数字を繋げる。その数字が奇数なのか、偶数なのか?。その数字が3の倍数なのか?合流値や分岐値なのか、分岐して、倍化して倍数列値になり、変形して約数列値になり、数列がどんどん長くなっていく。
整数という単独の数値の論理ではなく、数値の繋がりの体系論とかがあるのであれば、数値の繋がりの体系論という事で処理すべきだろう。
それは、コラッツ数列を値Nの順番に並べた一覧と、コラッツ数列の短い順に並べた一覧が一致することにより証明になるのではないのだろうか?どうなのだろう。ただ単に並べ替えただけだけど。
並べ替えることによって、その体系にする事ができ、元に戻すこともできる。
それによって、コラッツ数列が長くなるという事はどういう事なのかが見て取れる。
それにより、発散をせず、ループをせず、必ず1になる体系であるという事が見て取れる。それが証明になるのではないのだろうか?どうなのだろう。
しかし数学界は整数論として扱おうとしているのだろうから小難しい数式の記入がないものには証明のお墨付きは与えないのだろう。
などと思ってみたり。
Python3では、Integerに最大値がないようだ。という事は一億二千万の数字でコラッツ数列を出すならPython3で、計算して、計算表に出力すればよいという事になるのかな。
Python3での配列のアレイの操作を覚えるべきか?。
OverFlowでエラーになるので、N値だけセルに記入するようにしたら、遅くなった。
9時間かけて、エラーになる数字を突き止めた。ということにしておこう。8278015だ。
modの対策をしないとダメなようだ。
1(N/2)
55;/2...1
27;
9/2=4.5
9-(INT(4.5)*2)
9-(INT(9/2)*2)
N-(INT(N/2)*2) fix?
N-FIX(N/2)*2
前日の続き----------------------------------------------
10ステップめは、6個。それぞれが倍数列値になった。
3の倍数の12と84は、倍数列値で3の倍数の24と168になった。
奇数の13と85は、倍数列で偶数の26と170になった。
偶数の80と512は、倍数列値の偶数の分岐する値160と1024になった。
24; 12, 6, 3,10, 5,16,8,4,2,1
26; 13, 40, 20,10, 5,16,8,4,2,1
160; 80, 40, 20,10, 5,16,8,4,2,1
168; 84, 42, 21,64,32,16,8,4,2,1
170; 85,256,128,64,32,16,8,4,2,1
1024;512,256,128,64,32,16,8,4,2,1
11ステップめは、8個。
3の倍数の24と168は倍数列値で3の倍数の48と336になった。
偶数の26と170は倍数列値で偶数の分岐する値の52と340になった。
分岐値の160と1024は、約数列値で奇数の53と341、倍数列値で偶数の320と2048になった。
48; 24, 12, 6, 3,10, 5,16,8,4,2,1
52; 26, 13, 40, 20,10, 5,16,8,4,2,1
53; 160, 80, 40, 20,10, 5,16,8,4,2,1
320; 160, 80, 40, 20,10, 5,16,8,4,2,1
336; 168, 84, 42, 21,64,32,16,8,4,2,1
340; 170, 85,256,128,64,32,16,8,4,2,1
341;1024,512,256,128,64,32,16,8,4,2,1
2048;1024,512,256,128,64,32,16,8,4,2,1
12ステップめは数列が10。ここで5系統と32系統の一部がねじれ?編み込み?の様にずれ始めた。
3の倍数48と336は、倍数列値で3の倍数の96と672になった。
分岐値の52と340は、約数列値で奇数の17と113、倍数列値で偶数の104と680になった。
奇数の53と341は、倍数列値で偶数の分岐する値の106と682になった。
偶数の320と2048は、倍数列値で偶数の分岐する値の640と4096になった。
17; 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
96; 48, 24, 12, 6, 3,10, 5,16,8,4,2,1
104; 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
106; 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
113; 340, 170, 85,256,238,54,32,16,8,4,2,1
640; 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
672; 336, 168, 84, 42, 21,64,32,16,8,4,2,1
680; 340, 170, 85,256,128,64,32,16,8,4,2,1
682; 341,1024,512,256,128,64,32,16,8,4,2,1
4096;2048,1024,512,256,128,64,32,16,8,4,2,1
13ステップめは、数列が14。
3の倍数96と672は、倍数列値で3の倍数の192と1344になった。
奇数の17と113は、倍数列値で偶数の分岐する値の34と226になった。
偶数の104と680は、倍数列値で偶数の分岐する値の208と1360になった。
分岐値の106と682は、約数列値で奇数の35と227、倍数列値で偶数の212と1364になった。
分岐値の640と4096は、約数列値で3の倍数の213と1365、倍数列値で偶数の1280と8192になった。
34; 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
35; 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
192; 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
208; 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
212; 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
213; 640, 320, 160, 80, 40, 20,10, 5,16,8,4,3,1.
226; 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
227; 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
1280; 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
1344; 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
1360; 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
1364; 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
1365;4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
8192;4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
書き間違え等の確認の為に、右端にピリオドを打って確認することにした。
14ステップめは、数列が18。
3の倍数の192と1344は、倍数列値で3の倍数の384と2688になった。
分岐値の34と226は、約数列値で奇数の11と3の倍数の75、倍数列値で偶数の68と452になった。
分岐値の208と1360は、約数列値で3の倍数の69と453になり、倍数列値で偶数の416と2720になった。
奇数の35と227は、倍数列値で偶数の70と454になった。
偶数の212と1364は、倍数列値で偶数の分岐する値の424と2728になった。
3の倍数の213と1365は、倍数列値で3の倍数の426と2730になった。
偶数の1280と8192は、倍数列値で偶数の分岐する値の2560と16384になった。
11; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
68; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
69; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
70; 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
75; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
384; 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
416; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
424; 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
426; 213, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
452; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
453;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
454; 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2560;1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
2688;1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
2720;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
2728;1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2730;1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
16384;8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
分岐値のとは、約数列値で奇数のとになり、倍数列値で偶数のとになった。
2021年12月5日(日曜日)
nStt = 1, nEnd = 120000000, nKai = 30, vB = 100000で昨日から動かしているが、朝までには終わっていなかった。エラーにもなっていない
iRow = 3412, SttEnd = 21408597, CPUTime = 21:42:48 とか。とりあえず、if N mod 2 = 0 thenを修正した成果が出だという事なのだろう、Over Flowせずに、10000000を突破した。
2^27,134217728ってことは、nKai=30もいらないようだ。エラーになったら、今までのところまでを出力する方法が必要か?。もしくは、一定回数おきに出力させる方法を考えるべきか。
「Apache OpenOffice Wiki エラー処理」を参照した。
Sub
On Error GoTo ErrorHandler
Dim
通常のプログラムコード
On Error Goto 0
Exit Sub
ErrorHnadler:
エラーハンドラ用コード
Resume Next'エラー発生行の次の行にプログラム実行を戻して、処理を再開
ErrorHandler:
エラーハンドラ用コード
Resume Proceed
Proceed:
エラーハンドラ用コードを実行した後のプログラムの実行開始位置を指定
ErrorHnadler:
if Err = ExpectedErrorNo Then
else
end if
On Error Goto 0
Endsub
続き ---------------------------------------------------
14ステップめは、数列が18。
3の倍数の192と1344は、倍数列値で3の倍数の384と2688になった。
分岐値の34と226は、約数列値で奇数の11と3の倍数の75、倍数列値で偶数の68と452になった。
分岐値の208と1360は、約数列値で3の倍数の69と453になり、倍数列値で偶数の416と2720になった。
奇数の35と227は、倍数列値で偶数の分岐する値の70と454になった。
偶数の212と1364は、倍数列値で偶数の分岐する値の424と2728になった。
3の倍数の213と1365は、倍数列値で3の倍数の426と2730になった。
偶数の1280と8192は、倍数列値で偶数の分岐する値の2560と16384になった。
11; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
68; 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
69; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
70; 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
75; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
384; 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
416; 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
424; 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
426; 213, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
452; 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
453;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
454; 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2560;1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
2688;1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
2720;1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
2728;1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
2730;1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
16384;8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
15ステップめは、数列が24。
3の倍数の384と2688は、倍数列値で偶数の768と5376になった。
奇数の11と3の倍数の75は、倍数列値で偶数の分岐する値22と分岐しない3の倍数150になった。
偶数の68と452は、倍数列値で偶数の分岐する値の136と904になった。
3の倍数の69と453は、倍数列値で偶数の138と906になった。
偶数の416と2720は、倍数列値で偶数の分岐する値の832と5440になった。
分岐値の70と454は、約数列値で奇数の23と151になり、倍数列値で偶数の140と908になった。
分岐値の424と2728は、約数列値で奇数の141と909になり、倍数列値で偶数の848と5456になった。
3の倍数の426と2730は、倍数列値で偶数の852と5460になった。
分岐値の2560と16384は、約数列値で奇数の853と5461になり、倍数列値で偶数の5120と32768になった。
(注意:奇数の11と75は、倍数列値で偶数の分岐する値22と分岐しない150になった。)
22; 11, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
23; 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
136; 68, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
138; 69, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
140; 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
141; 424, 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
150; 75, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
151; 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
768; 384, 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1.
832; 416, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1.
848; 424, 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1.
852; 426, 213, 460, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
853; 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
904; 452, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1.
906; 453,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
908; 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
909; 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
5120; 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1.
5376; 2688,1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1.
5440; 2720,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1.
5456; 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1.
5460; 2730,1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
5461;16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
32768;16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1.
16ステップめは、数列が29。奇数になった?。
3の倍数の768と5376は、倍数列値で3の倍数の536と10752になった。
分岐値22は、約数列値で奇数の7、倍数列値で偶数の44になった。
3の倍数150は、倍数列値で3の倍数の300になった。
7; 22, 11, 34, 17, 52, 25, 13, 40, 20,10, 5,16,8,4,2,1
44; 22, 11, 34, 17, 52, 25, 13, 40, 20,10, 5,16,8,4,2,1
45; 136, 58, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
46; 23, 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
272; 136, 68, 34, 17, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
276; 138, 69, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
277; 832, 416, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
280; 140, 70, 35, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
282; 141, 424, 212, 106, 53, 160, 80, 40, 20,10, 5,16,8,4,2,1
300; 150, 75, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1
301; 904, 452, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1
302; 151, 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
1536; 768, 384, 192, 96, 48, 24, 12, 6, 3,10, 5,16,8,4,2,1
1664; 832, 416, 208, 104, 52, 26, 13, 40, 20,10, 5,16,8,4,2,1
1696; 848, 424, 212, 106, 52, 160, 80, 40, 20,10, 5,16,8,4,2,1
1704; 852, 426, 213, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
1706; 853, 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
1808; 904, 452, 226, 113, 340, 170, 85,256,128,64,32,16,8,4,2,1
1812; 906, 453,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1
1813; 5440, 2720,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1
1816; 908, 454, 227, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
1818; 909, 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
10240; 5120, 2560,1280, 640, 320, 160, 80, 40, 20,10, 5,16,8,4,2,1
10752; 5376, 2688,1344, 672, 336, 168, 84, 42, 21,64,32,16,8,4,2,1
10880; 5440, 2720,1360, 680, 340, 170, 85,256,128,64,32,16,8,4,2,1
10912; 5456, 2728,1364, 682, 341,1024,512,256,128,64,32,16,8,4,2,1
10920; 5460, 2730,1365,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
10922; 5461,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
65536;32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1
分岐値のとは、約数列値で奇数のとになり、倍数列値で偶数のとになった。
このような事をやっていて、証明はどのようにするのか?想像はできるだろうか?。
その方法が正しいのかどうかはわからないけど。
コラッツ数列
Nが奇数なら、3 * N + 1 = G
Nが偶数なら、N / 2 = K
逆数列
奇数なら、
N = K * 2
G = K * 2
偶数なら、
N = G * 2
G = G * 2
偶数なら、
K = ( G - 1 ) / 3
----------------------------------------------
・地震が起きるの8℃おき?2℃、10℃、18℃、26℃、34℃、42℃、50℃。2段階下がると起きやすくなる感じ?。気温が下がってくるときの26℃が地震が起きやすい温度帯か?。
2010年のワシントンやニューヨークで起きた震度4の地震が良い例になるかもしれない。100年ぶりの42℃を記録。その後、気温が下がってから地震が起きた。
地震を起こすためのトリガー。そのトリガーに加わる複数の力。最終的にどの力が増加してトリガーを引くのか?
地震を起こすためのトリガーに加わっている力。その力が変化するときに自然界ではどのような変化が起きているのか?その自然界での変化をとらえることにより地震を起こすためのトリガーに加わっている力の加減を知ることは可能なのだろうか?
功名心と利益の為に暴走する人々か?
カネや権力や既得権益関係者が関わって民主主義の名の下に世論や政治家が作られる?
そこにカネを出すスポンサー企業達。
それをまとめる大物プロデューサー達。
・データマイニングのやり方って、「事実を元にシナリオを描き、そのシナリオを検証する」?でいいんだっけ?事実を元にシナリオを描き、そのシナリオを検証する→意外と大事だよ。相場にも使えるかも、ははは、使えなかったりして...。シナリオ=妄想?、俺って適任?。
"2021年12月5日(日曜日)コラッツプレーンストーミング13" へのコメントを書く