![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
「コラッツの予想」を確かめるため、下記のようなマクロを書いてみました。
コラッツの予想とは「正の整数に対して、偶数なら2で割り、奇数なら3を掛け1を足す。これを繰り返すとやがて1になる。」という未だ証明されてない数学の問題です。
Sub Collatz_test02()
Dim x As Double
t = Time()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
For n = 1 To 10000000
x = n + 1
'.StatusBar = n & "目を処理中です。"
'Cells(n) = x
Do While x > 1
If Int(x / 2) = x / 2 Then 'Modは途中でエラー!
x = x / 2
Else
x = x * 3 + 1
End If
Loop
Next
.StatusBar = ""
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
Cells(1 , 1) = Time() - t
End Sub
1.セルにいちいち数値をいれたり、進行状況をStatusBarに表示したりしなければ1~1000万までは約8分で終了し、少なくとも1000万までは「予想」は正しいことを実証できましたが、このペースではこれを10億や100億まで試すわけにもいきません。
なにか良い方法はありますでしょうか?数台のPCを使って分散するという方法以外でお願いします。(エクセル2000です)
2.Mod演算子を使うと途中で必ずエラーになります。なぜでしょうか?
No.1ベストアンサー
- 回答日時:
プログラム自体よりもアルゴリズムの話ですが、すでにチェックを
終えた数値に一旦なれば、そこでその数値の計算を終了するという
一文を入れたらどうでしょうか? つまり、500という数字を検証して
いるのならば、499以下の数字になればそこで証明済みなのでストップ
させるということです。毎回カウントアップしていけば、すぐに
チェックできると思います。
プログラムに明るくありませんので、すでにその機構が上記の
プログラムに含まれているのなら失礼しました。
なるほど、仰せのとおりです。
下記のように修正したところ、1000万までわずか30秒でした!
このペースなら100億にも手が届きそうです。
Sub Collatz_test03()
Dim x As Double, n As Double
Dim t As Date
t = Time()
Cells(1, 1) = t
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
For n = 1 To 10000000
x = n + 1
Do While (1)
If Int(x / 2) = x / 2 Then
x = x / 2
Else
x = x * 3 + 1
End If
If x = 1 Then Exit Do
If x < n Then Exit Do
Loop
Next
.StatusBar = ""
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
Cells(2, 1) = Time()
Cells(3, 1) = Time() - t
End Sub
No.3
- 回答日時:
こんばんは。
Wendy02です。私には、むつかしい話は加われませんが、
>2.Mod演算子を使うと途中で必ずエラーになります。なぜでしょうか?
>偶数の判定に便利なMOD演算子をつかうと、n=113383で必ずエラーになります。なぜかわかりませんでしょうか?
Long 型は、2,147,483,647 が上限ですから、それを越える数値は扱うことが出来ません。たぶん、それを越えて、オーバーフローが起きているのだと思います。Mod の精度の一番上の型は、Long 型です。n がいくらDouble 型でも、Mod の演算で、サイズダウンしますから、Long 型の扱いになります。
この回答への補足
100億まで試したところ、6時間弱で終了!
無限ループにならなかったということは100億までは「コラッツの予想」の検証ができたということですよね。できたからと言って得するわけじゃないですけど(笑)
ありがとうございました。o(^-^)o
Wendy02さん、いつもご指導ありがとうございます。
> Mod の精度の一番上の型は、Long 型
そうなんですか?!上限があるなんて存じませんでした。Σ( ̄ロ ̄lll)
> Long 型は、2,147,483,647 が上限
それじゃ、2,482,111,348でひっかかるのは当然なんですね。
勉強になりました。<(_ _)>
No.2
- 回答日時:
ここが参考になりそうです。
(コラッツ予想は、一回とんでもない数字に行ってから帰ってくる
こともあるので難しいですね。というかおもしろいですね)
http://blog.livedoor.jp/dankogai/archives/505627 …
参考URL:http://blog.livedoor.jp/dankogai/archives/505627 …
この回答への補足
昨夜、100億まで試しました。
6時間弱かかりましたが無限ループになりませんでしたので100億までは「コラッツの予想」の検証ができました。できたからと言って別にどうかなるわけじゃないんですが(笑)
ありがとうございました。o(^-^)o
kinki-uさん、何度もありがとうございます。
御紹介のサイトはVBAではないのでよくわかりませんが、113383が1812855948になってひっかかったようです。
わたしのは120回目で2482111348になってひっかかりました。
If x Mod 2 = 0 Then を If Int(x / 2) = x / 2 Then に変えてやって247回目で1に収束したのですが。
面白いですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
VBA データ(特定値)のある最...
-
文字列内で括弧を使うには
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
実行時エラー 438 の解決策をお...
-
ApplicationとWorksheetFunctio...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
Filter関数を用いた結果、何も...
-
「実行時エラー '3167' レコー...
-
エクセルVBAで埋め込みグラフ(C...
-
お助けください!VBAのファイル...
-
VBでSQL文のUPDATE構文を使った...
-
エクセルVBA 「On Error GoTo...
-
pythonのopenpyxlについて
-
ACCESSで値を代入できないとは?
-
VB6とVB.NETでNullの扱いが違う?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
マクロで"#N/A"のエラー行を削...
-
VBAでfunctionを利用しようとし...
-
文字列内で括弧を使うには
-
実行時エラー 438 の解決策をお...
-
エクセル関数を教えてください
-
On ErrorでエラーNoが0
-
お助けください!VBAのファイル...
-
VBA データ(特定値)のある最...
-
【VBA】ワークブックを開く時に...
-
インポート時のエラー「データ...
-
実行時エラー'-2147467259(8000...
-
マクロの「SaveAs」でエラーが...
-
WindowsでのPythonの挙動について
-
ApplicationとWorksheetFunctio...
-
Excel vbaについての質問
-
エクセルVBA 「On Error GoTo...
-
Filter関数を用いた結果、何も...
-
ACCESSで値を代入できないとは?
おすすめ情報