2021年12月12日(日曜日)コラッツブレーンストーミング14

2021年12月12日(日曜日)コラッツブレーンストーミング14

----------------------------------------------

2021年12月6日(月曜日)

コラッツ逆数列最初の一歩?。

Sub AAA
ThisComponent.Sheets(0).clearContents(511)
Dim N as Integer
Dim iRow as Integer
Dim iCol as Integer
Dim cCol as Integer
Dim cStt as Integer
Dim cEnd as Integer
Dim cSttEnd as Integer

cStt = 1
cEnd = 10

iColc =3
For cSttEnd = cStt TO cEnd

ThisComponendt.Sheets(0).getCellByPosition(iCol, iRow).Value = cSttEnd

iCol = iCol + 1

Enxt cSttEnd

End Sub



ちなみにコラッツ数列最初の一歩はこちら。

Sub SetNumber0
ThisComponent.Sheets(0).clearcontents(511)
Dim i as Long, EndI as Long
Dim conN as Integer
Dim RowPlus as Integer
RowPlus = 5
colN = 3

EndI=30
For i=1 to Endi step 1
thisComponent.Sheets(0).getCellByPosition(colN , i + RowPlus).Value = i
next i
endsub


---------------------------------


コラッツ数列
Nが奇数なら、3 * N + 1 = G
Nが偶数なら、N / 2 = K


cStt = 1 '何列の数列から表示するのか
cEnd = 10 '何列の数列まで表示するのか
Count = 0
cC = 0
iRow = 1
nCnt = 1


書き込むcolc
終了判定c


For cSttEnd = cStt to cEnd
iCol = cStt
N = 1
出力(N,colN,iRow)
Do until cC = cSttEnd

逆数列
奇数なら、
N = N * 2
G = K * 2

偶数なら、
N = N * 2
G = G * 2

偶数なら、
N = ( N - 1 ) / 3
K = ( G - 1 ) / 3


1を書く,行と列
偶奇判定
 奇数
  N = N * 2
出力(行,列+1)

 偶数
  約数列値か?N = (N-1)/3
   出力(行、列+1)

  倍数列


----------------------------
cStt=1
1を記入
奇数なので2倍して次の列にN=2を記入、回数1とNを記入。cStt = cC

cStt=2
1を記入
奇数なので2倍して次の列にN=2を記入、回数1とNを記入。cStt = cC
2は偶数だが分岐値ではないので二倍して次の列に4を記入


cStt=3
1を記入
奇数なので2倍して次の列にN=2を記入、回数1とNを記入。cStt = cC
2は偶数だが分岐値ではないので二倍して次の列に4を記入。cStt =cC
4は偶数で分岐値
 約数列値1を次の列に記入。
 分岐値の処理


-------------------------------

奇数、分岐する値1、分岐する値2、偶数。
b1,b2




cstt=1、行、列
1を記入
1は奇数なので分岐無し、二倍して列の後ろに出力。計算回数=1とN=2。
計算回数 = cstt = 1 終了。


cstt=2、行、列
計算回数が、cstt-1の数値すべてに行う。N=2
行+1後、1を記入
1は奇数なので分岐無し、二倍して列の後ろに出力。計算回数=1とN=2。
2は偶数で分岐値ではない。二倍して列の後ろに出力。計算回数=2、N=4。
計算回数 = nstt = 2 終了。


cstt=3、行、列
計算回数が、cstt-1の数値すべてに行う。N=4
行+1後、1を記入
1は奇数なので分岐無し、二倍して列の後ろに出力。計算回数=1とN=2。
2は分岐値ではない偶数。二倍して列の後ろに出力。計算回数=2、N=4。
4は分岐値で、b1=1とb2=8。
4の後ろにb1=1を出力。計算回数=3とN=1

行+1後、1を記入
1は奇数なので分岐無し、二倍して列の後ろに出力。計算回数=1とN=2。
2は分岐値ではない偶数。二倍して列の後ろに出力。計算回数=2、N=4。
4は分岐値で、b1=1とb2=8。
4の後ろにb2=8を出力。計算回数=3とN=8


cstt=4
計算回数が、cstt-1の数値すべてに行う。N=8
行+1後、1を記入
1は奇数なので分岐無し、二倍して列の後ろに出力。計算回数=1とN=2。
2は分岐値ではない偶数。二倍して列の後ろに出力。計算回数=2、N=4。
4は分岐値で、b1=1とb2=8。
4の後ろにb2=8を出力。計算回数=3とN=8
8は分岐値ではない偶数。二倍して列の後ろに出力。計算回数=4とN=16


cstt=5
計算回数が、cstt-1の数値すべてに行う。N=16
行+1後、1を記入
1は奇数なので分岐無し、二倍して列の後ろに出力。計算回数=1とN=2。
2は分岐値ではない偶数。二倍して列の後ろに出力。計算回数=2、N=4。
4は分岐値で、b1=1とb2=8。
4の後ろにb2=8を出力。計算回数=3とN=8
8は分岐値ではない偶数。二倍して列の後ろに出力。計算回数=4とN=16
16は分岐値、b1=5,b2=32
16の後ろに



奇数は二倍する
偶数は先に約数列値の有り無しの確認後、数列を二つ作り付け足す。


一部だけ表示が可能になった?。先は長そう。

Sub Gyakusuu
ThisComponent.Sheets(0).clearContents(511)

Dim WorkArea as Integer
Dim colK as Integer
Dim colN as Integer
Dim colWK as Integer
Dim colWN as Integer
Dim cN as Double
Dim cKai as Integer
colWK = 0
colWN = 1
colK = 2
colN = 3
WorkArea = 4

Dim N as Double
Dim iRow as Double
Dim iCol as Integer
Dim cStt as Long
Dim cEnd as Double
Dim cSttEnd as Double
Dim Count as Integer
Dim K as Integer

cStt = 1
cEnd = 20

Dim AryData as Variant
Dim vL as Integer
Dim vT as Integer
Dim vR as Integer
Dim vB as Integer
vL = 0
vT = 0
vR = cEnd + WorkArea + 1
vB = 10000

iCol = WorkArea
Count = 0
iRow = 1
cRow = 1

aryData = ThisComponent.Sheets(0).getCellRangeByPosition(vL,vT,vR,vB).getDataArray()

For cSttEnd = cStt to cEnd
iCol = WorkArea + 1

N = 1
aryData(iRow)(iCol) = N
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = N

Do Until Count =cSttEnd
iCol = iCol + 1

if N - FIX ( N / 2 ) * 2 = 1 then
N = N * 2
aryData(iRow)(iCol) = N
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = N

elseif ((N - 1) / 3) - FIX (((N - 1) / 3) /2) * 2 = 1 then
K = ( N - 1 ) / 3

if K = 1 then
Goto Continue1:
endif

aryData(iRow)(iCol) = K
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = K
N = K
else
Continue1:
N = N * 2
aryData(iRow)(iCol) = N
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = N
endif
Count = Count + 1

cKai = aryData(iRow - 1)(colK)
aryData(iRow)(colWK) = cKai
ThisComponent.Sheets(0).getCellByPosition(colWK, iRow).Value = cKai

cN = aryData(iRow - 1)(colN)
aryData(iRow)(colWN) = cN
ThisComponent.Sheets(0).getCellByPosition(colWN, iRow).Value = cN
Loop
aryData(iRow)(colK) = Count
ThisComponent.Sheets(0).getCellByPosition(colK, iRow).Value = Count

aryData(iRow)(colN) = N
ThisComponent.Sheets(0).getCellByPosition(colN, iRow).Value = N

Count = 0
iRow = iRow + 1
iCol = 0

Next cSttEnd

' ThisComponent.AddActionLock()
' ThisComponent.Sheets(0).clearContents(511)
ThisComponent.Sheets(0).getCellRangeByPosition(vL, vT, vR, vB).setDataArray(aryData)
ThisComponent.removeActionLock()

End Sub






2021年12月7日(火曜日)


分岐値の処理をどうすべきなのか悩む。
分岐値対策として、分岐することを前提に、途中経過を二列作って分岐値でなかったら片方を消す。
で、分岐する値は解決したとして、他の奇数、偶数、3の倍数の数列をどう作るのか?。分岐した情報をどこにどう持たせるのか?。そんなことを考えていたら、ブレスト13で、最後の方でやっていたことを思い出し、数列の先頭だけを処理して更新すればよいだろうという事になった。途中経過の数列はは省略。もしくは、コピーして貼り付けて先頭の数字の処理をして、数値を追加していけばよい?。そうやって作った逆数列と、計算をして作ったコラッツ数列が、同じであることを証明すればよい?。

木を見て森を見ず
森を見て木を見ず

逆数列の作成を考えている人達が成功しないのは、木を見ているからだろう。
私は文字通り?1から森を作ろうとしている。森を管理するときに一本一本を見ていたらきりがない、成長具合に応じて全体の成長具合を見ながら管理しなければならないかもしれない。



-------------------------------------------

まずは初回目の1を記入。

01回目。初期値を検索、1を発見。
1を判定。1は奇数なので二倍する。2になる。
行を下げて2を出力。

02回目。01回目の数値を検索、2を発見。
2を判定。2は偶数なので約数列値と倍数列値を確認する。
約数列値なし、倍数列値4

03回目。02回目の数値を検索、4を発見。4を判定。4は偶数なので、約数列値と倍数列値を確認。(N-1)/3で1、二倍で8



04回目。03回目の1と8を判定。


------------------------------------------------
1を出力し回数とNを作業エリアに書き出す


回数確認しながら処理

 作業エリアの1回目の値を検索
  有れば
   処理して、次の行+1、列+1の2回目の列に出力
  無ければ
   回数+1して、次の回


-------------------------------------------
まずは、やろうとしていることを説明すべし。

1からはじめて、判断して処理をする。
1は奇数なので2倍してN=2、行下げ、列右に出力してkCとkNを書く。nSttEnd = kC,
kNの2偶数を見て二倍してN=4、行下げ、列右に出力してkCとkNを書く。
kNの4分岐値をみて、(4-1)/3=1、行下げ、列右に出力してkCとkNを書く。
kNの4分岐値をみて二倍して8、行下げのみ、出力してkCとkNを書く。
kNの1を見て処理なし。、
kNの8を見て二倍してN=16、行下げ、列右に出力してkCとkNを書く。
kNの16を見て、(16-1)/3=5、行下げ、列右に出力してkCとkNを書く。
kNの16を見て二倍して32、行下げのみ出力してkCとkNを書く






2021年12月8日(水曜日)

なかなか難しい。

Nを見て計算し出力。回数とNを作業用に書く。N,row,col,count,n
回数とNを参照し、計算し出力。回数とNを書く。
回数とNを参照し、計算し出力。回数とNを書く。

回数を判断し、回数とNを参照し、計算し出力。回数とNを書く。
回数を判断し、回数とNを参照し、計算し出力。回数とNを書く。


終了する回数か?

-----------------------------


これの、どこをどう直せばよいのかがわからない。
For nSttEnd = nStt to nEnd

Do Until vC = nSttEnd
iCol = iCol + 1
iRow = iRow + 1
nC = nC + 1

vC = ThisComponent.Sheets(0).getCellByPosition(0, wRow).Value
N = ThisComponent.Sheets(0).getCellByPosition(1, wRow).Value





if vC = nSttEnd then



if N mod 2 = 1 then

G = N * 2
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = G
ThisComponent.Sheets(0).getCellByPosition(0, iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(1, iRow).Value = G

elseif N mod 2 = 0 then
G = N * 2
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = G
ThisComponent.Sheets(0).getCellByPosition(0, iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(1, iRow).Value = G

if ((N-1)/3)-FIX(((N-1)/3)/2)*2 = 1 then
K = (N - 1)/3
iRow = iRow + 1
ThisComponent.Sheets(0).getCellByPosition(iCol, iRow).Value = K
ThisComponent.Sheets(0).getCellByPosition(0, iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(1, iRow).Value = K

Endif
Endif
Endif


Continue1:
wRow = wRow + 1




Loop

Next nSttEnd

End Sub





2021年12月9日(木曜日)


rRow vC
if vC = nSttEnd
処理


nC と rrowの加算方法
if nC rRow

-------------------------------


とりあえず、ほしい図が書けた。1から作るコラッツ数列を作るプログラム完成。
1から100までの数列を出せと言われてもむり。


数字は逆数列の数字が出ていたが、列の位置がずれてなかなか思う位置にでてこなかった。フラグを作って「 Flag = 0 」でうまくいかなかったので、「 Flag <> 0 」にしたらピタッとおさまった。1から始める逆数列の出来上がり。



__1_1
__2__2
__4___4
__1____1
__8____8
_16_____16
__5________5
_32_______32
_10_________10
_64_________64
__3_____________3
_20____________20
_21____________21
128___________128
__6________________6
_40_______________40
_42_______________42
256______________256






2021年12月10日(金曜日)

コラッツ逆数列の大きな数字をカットするフィルターを作らないとメモリや数値の大きさが厳しい感じ。
列が二桁なので、コラッツ数列の作成よりは早く終わる感じかな、

93273行目に、824633720832
117833行目に、25184372088832

47回目?46回目?で、24560


nEND = 150000、aR = 50、aB = 200000で実行したらエラーにならずに正常終了した。
メインメモリ100%のスワップ543.2MB(52.9%)で、189529行目、49、139188746


nEnd = 200000、aR = 55、aB = 250000、落ちた。Index out of defined range.
nEnd = 200000、aR = 53、aB = 220000、落ちた。Index out of defined range.
nEnd = 180000、aR = 50、aB = 200000、落ちた。Index out of defined range.
nEnd = 160000、aR = 50、aB = 200000、落ちた。Index out of defined range.
エラーで出力するようにしたら、200001行目で落ちていた。

nEnd = 160000、aR = 50、aB = 210000、スワップ63.2%、202183行目、49、25708312
nEnd = 160000、aR = 50、aB = 220000、スワップ64.5%、202183行目、49、25708312
nEnd = 160000、aR = 51、aB = 220000、スワップ67.4%、202183行目、49、25708312
nEnd = 170000、aR = 51、aB = 220000、スワップ73.5%、214814行目、49、997505184
nEnd = 180000、aR = 51、aB = 220000、スワップ76.6%、220001行目、49、27811380
nEnd = 180000、aR = 51、aB = 230000、スワップ80.4%、227449行目、49、167165034
nEnd = 180000、aR = 51、aB = 240000、スワップ85.5%、227449行目、49、167156034
リブートした。
nEnd = 190000、aR = 51、aB = 240000、スワップ89.8%、240001行目、50、216803
nEnd = 190000、aR = 51、aB = 250000、スワップ100%、240083行目、50、36052、メインメモリ99.1%
nEnd = 190000、aR = 50、aB = 250000、スワップ97.9%、237667行目、49、281474976710656
aRを減らしたら、表示される経数が減った。2行ほど作業エリアにしてあるので49列まで
nEnd = 195000、aR = 51、aB =240000 、スワップ%、行目、、


nEnd = 、aR = 、aB = 、スワップ%、行目、、
nEnd = 、aR = 、aB = 、落ちた。Index out of defined range.


27,31,41,47,54,55,62,63,71,73,82,83,91,94,95,97,103,107,108,109,110,111,121,124,125,126,129,137,142,143,




とりあえず、コラッツの逆数列がセルに出力されているところを目で見るバージョン。
遅いけど確実で、メインメモリやスワップファイルの容量不足の心配不要?。

LibreOffice Calc 5 のマクロ。分割して貼り付けます。

Sub CollatzForestForRest
'シートのデータを消す。
ThisComponent.Sheets(0).clearContents(511)'シートのデータを消す。
Dim N as Double '数列値N
Dim K as Double '約数列値用
Dim iRow as Double '数列の行目
Dim iCol as Double '数列の列目integer?
Dim nEnd as Long
Dim nC as Integer

'-----------終了値nEndの変更可能。
'
nEnd = 100
'
'-----------実際には、たぶん約数列値の分だけ、指定値よりも出力行が多くなる。

Dim wArea as Integer
Dim kC as Integer
Dim kN as Integer
Dim rRow as Double
Dim vC as Integer
Dim vN as Double
Dim oldvC as Long
Dim Flag as Integer
kC = 0
kN = 1
wArea = 2


' ThisComponent.Sheets(0).getCellByPosition(kC , 0) = "kC"
' ThisComponent.Sheets(0).getCellByPosition(kN , 0) = "kN"

nC = 1
iCol = wArea
iRow = 1

'-----------開始値Nの変更可能。特定の数字から辿るとき等に変更する。
'
N = 1
'
'-----------開始値Nの変更可能。特定の数字から辿るとき等に変更する。

ThisComponent.Sheets(0).getCellByPosition(iCol , iRow).Value = N
ThisComponent.Sheets(0).getCellByPosition(kC , iRow).Value = N
ThisComponent.Sheets(0).getCellByPosition(kN , iRow).Value = N

For rRow = 1 to nEnd

vC = ThisComponent.Sheets(0).getCellByPosition(kC , rRow).Value
N = ThisComponent.Sheets(0).getCellByPosition(kN , rRow).Value

Flag = vC - oldvC

if N - FIX (N / 2) * 2 = 1 then '奇数なら

if N = 1 then
if vC > 2 then
nC = nC + 1
iCol = iCol + 1
GoTo Continue1:
Endif
Endif

N = N * 2

if Flag <> 0 then
iCol = iCol + 1
nC = nC + 1
Endif
iRow = iRow + 1
ThisComponent.Sheets(0).getCellByPosition(iCol , iRow).Value = N
ThisComponent.Sheets(0).getCellByPosition(kC , iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(kN , iRow).Value = N

Elseif N - FIX (N / 2) * 2 = 0 then '偶数なら

if ((N - 1) / 3) - FIX ((( N - 1 )/ 3) / 2) * 2 = 1 then

K = (N - 1) / 3

if Flag <> 0 then
iCol = iCol + 1
nC = nC + 1
Endif
iRow = iRow + 1
ThisComponent.Sheets(0).getCellByPosition(iCol , iRow).Value = K
ThisComponent.Sheets(0).getCellByPosition(kC , iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(kN , iRow).Value = K

N = N * 2

iRow = iRow + 1
ThisComponent.Sheets(0).getCellByPosition(iCol , iRow).Value = N
ThisComponent.Sheets(0).getCellByPosition(kC , iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(kN , iRow).Value = N

Else

N = N * 2

if Flag <> 0 then
iCol = iCol + 1
nC = nC + 1
Endif
iRow = iRow + 1
ThisComponent.Sheets(0).getCellByPosition(iCol , iRow).Value = N
ThisComponent.Sheets(0).getCellByPosition(kC , iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(kN , iRow).Value = N
Endif
Endif
Continue1:
oldvC = vC
Next rRow

End Sub





このテキストを見ながら、CentOSのLibreOfficeCalcに入力して動作確認をしたら、数値は合っているが表示位置がずれた。    
原因がわかったので修正した。気を付けなければいけないところを、惰性で貼りつけていたようだ。分岐する値の処理の偶数の処理。




噂?では、コラッツ数列の逆数列を値の1から作って、すべての整数?にたどり着く事が証明できればコラッツ予想の証明になる?みたいな事が書かれているページを見たことがある。で、値の1から逆数列を作るプログラムみたいなのはないのだろうか?。それを使って、検証すればよいだろうと思っているのは私だけなのだろうか?どうなのだろう。

__1_1
__2__2
__4___4
__1____1
__8____8
_16_____16
__5________5
_32_______32
_10_________10
_64_________64
__3_____________3
_20____________20
_21____________21
128___________128
__6________________6
_40_______________40
_42_______________42
256______________256

これから貼り付ける数列はコラッツ数列を計算回数と、値で並べ替えた数列になる。その数列の移り変わりを言葉で言い表したものになる。

長文失礼します。






これらで何が言えるのかというと、同じようなパターンの繰り返しだという事が言えるのではないだろうか?。パターンの繰り返しが得意なのは何なのかと言えば?プログラム。つまり、このパターンをプログラミングすればコラッツ逆数列を、値の1から作れるという事になる。と考えて作ってみた。
文字通り1から作るコラッツ逆数列。LibreOfficeCalc6で作った。それを目で見で、こっちのパソコンに手入力。その手入力されたテキストを見ながらOSをUbuntuから、CentOS Linux7のLibreOfficeCalc5に手入力して入力ミスを直して、同じものが出力できたので、ここに公開して、そのアルゴリズムがコラッツ逆数列を作っていることに間違いない事を検証しながら、コラッツ数列の検証でもしてみてくださいってところです。
木を見て森を見ず
森を見て木を見ず
ほとんどの人が木にこだわったので、逆数列が作れなかったのかもしれません。私は1という種をまき森を作ることを考えました。検証するのであれば、木だけでなく、森でも可能なのではないでしょうかどうなのでしょう。



うまくいけばこのようなものができるはずです。(空白の代わりにアンダーバーを使いました。)


__1_1
__2__2
__4___4
__1____1
__8____8
_16_____16
__5________5
_32_______32
_10_________10
_64_________64
__3_____________3
_20____________20
_21____________21
128___________128
__6________________6
_40_______________40
_42_______________42
256______________256



27とか、計算回数の多いものは出てくるまでにオーバーフローしたりエリア不足になる可能性があります。その場合は個別にチェックポイントを作り、チェックポイントの数値を「N = 160」とか「N = 184」とか入力して数字を辿っていけば、時間がかかりますが、検証は可能になります。

長文失礼しました。


3N+1,N=27,
82,41,124,62,31,94,47,142,71,214,107,322,161,484,242,121,364,182,91,274,137,412,206,103,310,155,466,233,700,350,175,526,263,790,395,1186,593,1780,890,445,1336,668,334,167,502,251,754,377,1132,566,283,850,425,1276,638,319,958,479,1438,719,2158,1079,3238,1619,4858,2429,7288,3644,1822,911,2734,1367,4102,2051,6154,3077,9232,4616,2308,1154,577,1732,866,433,1300,650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1,4,...





2021年12月11日(土曜日)

1
2,5,7,9,11
1/3,1,5/3
2/3,2,10/3


1
1*(2^A)
(3^(-1))*( 1*(2^A) -1)
(2^B) * ((3^(-1))*( 1*(2^A) -1)
(3^(-1))* ((2^B) * ((3^(-1))*( 1*(2^A)) -1) -1)
(2^C) * (3^(-1))* ((2^B) * ((3^(-1))*( 1*(2^A)) -1) -1)




式の記号がよくわからないのですが、こういう式なのでしょうか?

1
1*(2^A)
(3^(-1))*( 1*(2^A) -1)
(2^B) * ((3^(-1))*( 1*(2^A) -1)
(3^(-1))* ((2^B) * ((3^(-1))*( 1*(2^A)) -1) -1)
(2^C) * (3^(-1))* ((2^B) * ((3^(-1))*( 1*(2^A)) -1) -1)

この式の表記で正しいとした場合、

三番目の式
(3^(-1))*(1*(2^A)-1)

この式の表記で正しいとした場合、A=1の時、

(3^(-1))*(1*(2^A)-1)
=(3^(-1))*(1*(2^(1))-1)
=(3^(-1))*(1*(2)-1)
=(3^(-1))*(2-1)
=(3^(-1))*(1)
=(1)/3
=1/3

で整数にならないのですが?
と、考えた場合、この式で整数になる数もあるということですよね。
たぶん、この式は偶数の内の、分岐する値にあてはめて、約数列値の奇数を出す式だと思われます。



それらの数式の意味を考えて、言い表してみると、

単純に奇数の1
奇数の1を2倍していった偶数を算出
偶数になった値の、分岐する値になった数の約数列値の奇数を算出
奇数を倍化して偶数を算出
奇数を倍化して偶数になった値の、分岐する値になった数の約数列値の奇数を算出
奇数を倍化して偶数を算出

と言い表すことができるかもしれません。

このマクロは、それと同じことをやっていると思うのですが?どうなのでしょう?。



1:1

2:(1) *2

4:(1*2) *2

8:(1*2*2) *2, 1:((1*2*2) -1)/3

16:(1*2*2*2) *2

32:(1*2*2*2*2) *2, 5:((1*2*2*2*2) -1)/3

64:(1*2*2*2*2*2) *2, 10:(((1*2*2*2*2)-1)/3) *2

128:(1*2*2*2*2*2*2) *2, 21:((1*2*2*2*2*2*2) -1)/3,
20:((((1*2*2*2*2)-1)/3)*2) *2, 3:(((((1*2*2*2*2)-1)/3)*2) -1)/3



1:1
2:1*(2^1)
4:1*(2^2)
8:1*(2^3), 1:(1*(2^2)-1)/3
16:1*(2^4)
32:1*(2^5), 5:(1*(2^4)-1)/3
64:1*(2^6), 10:((1*(2^4)-1)/3)*2

128:1*(2^7), 21:((1*(2^6)-1)/3,
20:(((1*(2^4)-1)/3)*(2^2), 3:((((1*(2^4)-1)/3)*2)-1)/3


1:1
2:1*(2^1)
4:1*(2^2)
8:1*(2^3), 1:(1*(2^2)-1)*(3^(-1))
16:1*(2^4)
32:1*(2^5), 5:(1*(2^4)-1)*(3^(-1))
64:1*(2^6), 10:((1*(2^4)-1)*(3^(-1))*2

128:1*(2^7),
21:((1*(2^6)-1)*(3^(-1)),
20:(((1*(2^4)-1)*(3^(-1))*(2^2),
3:((((1*(2^4)-1)*(3^(-1))*2)-1)*(3^(-1))




コラッツ数列を算出し一覧にして、そのコラッツ数列を短い数列順、小さい値順に並べ替える。
コラッツ数列とコラッツ逆数列を比較し、漏れがないことが確認できれば、コラッツ数列はループせずに必ず1にたどり着く事が証明される?。
漏れがあるところは、コラッツ数列を参照し、逆数列で算出されたところまでを確認する。
確認できた数字から新たに逆数列を作成して、漏れがある数値まで辿る事によって、逆数列で漏れのある数値までたどり着くことを確認する必要がある。

別の方法。
逆数列で算出した値を小さい順に並べ、連続して出力しているかを確認する。
漏れがあるところは、コラッツ数列を参照し、逆数列で算出されたところまでを確認する。
確認できた数字から新たに逆数列を作成して、漏れがある数値まで辿る事で、漏れのある値にたどり着く事を確認して、漏れた値を埋めていく。
めんどくさいがこちらの方法が確実か?。


コラッツ数列の逆関数?のコラッツ逆数列自体が発散するアルゴリズムになっている?。
発散の反対は収束?。よって、コラッツ数列は必ず1に収束する?。
ん?コラッツ逆数列は発散を続けるので、収束はしない。
コラッツ数列はコラッツ逆数列の逆なので、コラッツ逆数列が発散を続ける限りコラッツ数列は収束することになる?。


というような、事実を元に妄想こじつけ口からでまかせではだめなのでしょうね。


大きな数字をカットするフィルターを付ければ、27(最大値9232)の逆数列も表示可能かもしれません。
メインメモリ4GBでは、アレイをつかって49ステップの入り口くらいまでしか作成できない。
やはり、アレイで計算していっぱいになったらシートに記入する方法を作って乗り切るべきか?。

外国人に声をかけて、どこかの大学で、逆数列を算出するプログラムを動かして検証してもらった方がよいのでしょうかね。
日本の大学でコラッツ数列の逆数列の検証とかしているところはあるのかどうかわかりませんし、高卒(電気科)なので伝手もない。



3N+1,N=27,の奇数。素数がらみ。
41 = 1 * 41
31 = 1 * 31
47 = 1 * 47
71 = 1 * 71
107 = 1 * 107
161 = 7 * 23
121 = 11 * 11
91 = 7 * 13
137 = 1 * 137
103 =1 *103
155 = 5 * 31
233 = 1 * 233
175 = 5 * 5 * 7
263 = 1 * 263
395 = 5 * 79
593 = 1 * 593
445 = 5 * 89
167 = 1 * 167
251 = 1 * 251
377 = 13 * 29
283 = 1 * 283
425 = 5 * 5 * 17
319 = 11 * 29
479 = 1 * 479
719 = 1 * 719
1079 = 13 * 83
1619 = 1 * 1619
2429 = 7 * 347
911 = 1 * 911
1367 = 1 * 1367
2051 = 7 * 293
3077 = 17 * 181
577 = 1 * 577
433 = 1 * 433
325 = 5 * 5 * 13
61 = 1 * 61
23 = 1 * 23
35 = 5 * 7
53 = 1 * 53
5 = 1 * 5
1 = 1 * 1




3N+1,N=27,
82,41,124,62,31,94,47,142,71,214,107,322,161,484,242,121,364,182,91,274,137,412,206,103,310,155,466,233,700,350,175,526,263,790,395,1186,593,1780,890,445,1336,668,334,167,502,251,754,377,1132,566,283,850,425,1276,638,319,958,479,1438,719,2158,1079,3238,1619,4858,2429,7288,3644,1822,911,2734,1367,4102,2051,6154,3077,9232,4616,2308,1154,577,1732,866,433,1300,650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1,4,...




とりあえずフィルター付けてみたら27が112列目に出ていた。計算をしていないで置いただけの1が1列目に有るので、計算のステップより1だけ大きくなる。


フィルターは、出力させるところが四か所あるが、四か所とも同じようにif文を付けた。


if N < Filter then
ThisComponent.Sheets(0).getCellByPosition(iCol , iRow).Value = N
ThisComponent.Sheets(0).getCellByPosition(kC , iRow).Value = nC
ThisComponent.Sheets(0).getCellByPosition(kN , iRow).Value = N
Else
iRow = iRow - 1
Endif


nEnd = 10000, Filter = 30000
327, 411, 415, 417
1000行目に、1057だった。漏れがある。


右手首が痛い。腱鞘炎ぎみだ。

nEnd = 100000, aR = 250, aB = 50000, Filter = 100000, 39705行, 203, 50802
703なし
先に、最大長を調べてから調節すべき?。





2021年12月12日(日曜日)

寝る前に、セル書用で、nEND = 1000000, Filter = 1000000 で開始しておいた。
397067行目, 297 ,595802
397068行目, 299 , 0 で、
1000001行目, 299 , 0
だった。
Filter の数値に余裕があるようだ。Filterを外しておけばよかった。

Filterを外して開始したら、500000行目で、53, 407959080だった。53は低すぎる27が表示されない。


nEnd = 1000000, Filter = 10000000
約30分くらいで、1029233行目に94, 1296238だった。94ってことは、フィルターの値が大きすぎたようだ。
500000, 75, 119500だ。

nEnd = 1000000, Filter = 5000000
約30分くらいで、1011083行目に124, 3825524




一般的にコラッツ数列の場合は奇数の事がよく語られる。私もコラッツ数列を作るにあたって重要なのは奇数だと思った。しかし、逆数列を作ることを考えると偶数が重要になってくる。逆をおこなうから、逆の事が重要になったという事なのだろう。コラッツのループの事を考えて、値と商の不整合によるループ、絶対値が小さくなることによる衝突などがわかった。そして、値と商と余りによる繋がりによって逆数列が作れると思って動き出し、手探りと妄想こじつけで9232にたどり着いた。その時の事を考えるとどの奇数を使うのかは偶数に依存している?と考えるようになったのかもしれない。



82;分岐値、約数列値;27
124;分岐値、約数列値;41
62
94;分岐値、約数列値;31
142;分岐値、約数列値;47
214;分岐値、約数列値;71
107
322;分岐値、約数列値;107
484;分岐値、約数列値;161
242
364;分岐値、約数列値;121
274;分岐値、約数列値;91
412;分岐値、約数列値;137
206
310;分岐値、約数列値;103
466;分岐値、約数列値;155
700;分岐値、約数列値;233
350
526;分岐値、約数列値;175
263
790;分岐値、約数列値;263
1186;分岐値、約数列値;395
593
1780;分岐値、約数列値;593
890
1336;分岐値、約数列値;445
668
334;分岐値、約数列値;111
502;分岐値、約数列値;167
754;分岐値、約数列値;251
1132;分岐値、約数列値;377
566
850;分岐値、約数列値;283
1276;分岐値、約数列値;425
638
958;分岐値、約数列値;319
1438;分岐値、約数列値;479
2158;分岐値、約数列値;719
3238;分岐値、約数列値;1079
4858;分岐値、約数列値;1619
7288;分岐値、約数列値;2429
3644
1822;分岐値、約数列値;607
2734;分岐値、約数列値;911
4102;分岐値、約数列値;1367
6154;分岐値、約数列値;2051
9232;分岐値、約数列値;3077
4616
2308;分岐値、約数列値;769
1154
1732;分岐値、約数列値;577
866
1300;分岐値、約数列値;433
650
976;分岐値、約数列値;325
488
244;分岐値、約数列値;81
122
184;分岐値、約数列値;6
92
46;分岐値、約数列値;15
70;分岐値、約数列値;23
106;分岐値、約数列値;35
160;分岐値、約数列値;53
80
40;分岐値、約数列値;13
20
10;分岐値、約数列値;3
16;分岐値、約数列値;5
8
4;分岐値、約数列値;1
2



3N+1,N=27,
82,41,124,62,31,94,47,142,71,214,107,322,161,484,242,121,364,182,91,274,137,412,206,103,310,155,466,233,700,350,175,526,263,790,395,1186,593,1780,890,445,1336,668,334,167,502,251,754,377,1132,566,283,850,425,1276,638,319,958,479,1438,719,2158,1079,3238,1619,4858,2429,7288,3644,1822,911,2734,1367,4102,2051,6154,3077,9232,4616,2308,1154,577,1732,866,433,1300,650,325,976,488,244,122,61,184,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1,4,...



有る範囲内の数列の最長の長さと初期値。逆数列を作るときの設定に使う。
10000までの数であれば最長は6172の261
100000までの数は


nEnd = 1000000, Filter = 5000000で、1011083行目、124、3825524
171がなかった。

nEnd = 1000000, Filter = 4000000で、1010334行目、144, 2656602
649, 654, 655, 667がなかった

nEnd = 1100000, Filter = 4000000で、1048576行目、149, 2206752 行の最後まで言ってエラーになった。
937が無かった。
BASIC runtime error.
An exception occurred
Type: com.sun.star.lang.indexOutOfBoundsException
Message:.

nEnd = 1100000, Filter = 10000で、最終行1048576まで、163, 0だった。4234行, 161, 5508
255がなかった。

nEnd = 1100000, Filter = 1000000で、1048576, 299 ,0











----------------------------------------------
・地震が起きるの8℃おき?2℃、10℃、18℃、26℃、34℃、42℃、50℃。2段階下がると起きやすくなる感じ?。気温が下がってくるときの26℃が地震が起きやすい温度帯か?。
2010年のワシントンやニューヨークで起きた震度4の地震が良い例になるかもしれない。100年ぶりの42℃を記録。その後、気温が下がってから地震が起きた。

地震を起こすためのトリガー。そのトリガーに加わる複数の力。最終的にどの力が増加してトリガーを引くのか?
地震を起こすためのトリガーに加わっている力。その力が変化するときに自然界ではどのような変化が起きているのか?その自然界での変化をとらえることにより地震を起こすためのトリガーに加わっている力の加減を知ることは可能なのだろうか?

功名心と利益の為に暴走する人々か?
カネや権力や既得権益関係者が関わって民主主義の名の下に世論や政治家が作られる?
そこにカネを出すスポンサー企業達。
それをまとめる大物プロデューサー達。

・データマイニングのやり方って、「事実を元にシナリオを描き、そのシナリオを検証する」?でいいんだっけ?事実を元にシナリオを描き、そのシナリオを検証する→意外と大事だよ。相場にも使えるかも、ははは、使えなかったりして...。シナリオ=妄想?、俺って適任?。

"2021年12月12日(日曜日)コラッツブレーンストーミング14" へのコメントを書く

お名前
ホームページアドレス
コメント