2024.01.08
2025.03.13
コラッツ予想

コラッツ予想の確認
コラッツ予想とは、任意の正の整数nに対して以下の操作を繰り返すと「必ず1になる」という予想です。
具体的な計算例は以下のとおりです。
n=2 → 1 n=3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 n=4 → 2 → 1 n=5 → 16 → 8 → 4 → 2 → 1 n=6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
2024年1月現在、コラッツ予想の真偽は明らかにされていません。
Javaソースコード
CollatzProblem.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024
public class CollatzProblem { public static void main( String[] args ) { // 1~100まで確認する for ( int i = 1; i <= 100; i++ ) { // nにiを代入 int n =i; // 計算を繰り返す // nがコラッツ予想どおり1にならなければループを抜けません for ( ; ; ) { // nが1になったら計算を終了 if ( 1 == n ) break; if ( 0 == ( n % 2 ) ) n = n / 2; // 偶数の処理 else n = n * 3 + 1; // 奇数の処理 } // 結果の出力 System.out.println( "n=" + i + " → " + n ); } } }
実行結果
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis CollatzProblem.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac CollatzProblem.java
CollatzProblemを実行
C:\talavax\javasample>java CollatzProblem
CollatzProblemの出力結果
n=1 → 1 n=2 → 1 n=3 → 1 n=4 → 1 n=5 → 1 n=6 → 1 n=7 → 1 n=8 → 1 n=9 → 1 n=10 → 1 n=11 → 1 n=12 → 1 n=13 → 1 n=14 → 1 n=15 → 1 n=16 → 1 n=17 → 1 n=18 → 1 n=19 → 1 n=20 → 1 n=21 → 1 n=22 → 1 n=23 → 1 n=24 → 1 n=25 → 1 n=26 → 1 n=27 → 1 n=28 → 1 n=29 → 1 n=30 → 1 n=31 → 1 n=32 → 1 n=33 → 1 n=34 → 1 n=35 → 1 n=36 → 1 n=37 → 1 n=38 → 1 n=39 → 1 n=40 → 1 n=41 → 1 n=42 → 1 n=43 → 1 n=44 → 1 n=45 → 1 n=46 → 1 n=47 → 1 n=48 → 1 n=49 → 1 n=50 → 1 n=51 → 1 n=52 → 1 n=53 → 1 n=54 → 1 n=55 → 1 n=56 → 1 n=57 → 1 n=58 → 1 n=59 → 1 n=60 → 1 n=61 → 1 n=62 → 1 n=63 → 1 n=64 → 1 n=65 → 1 n=66 → 1 n=67 → 1 n=68 → 1 n=69 → 1 n=70 → 1 n=71 → 1 n=72 → 1 n=73 → 1 n=74 → 1 n=75 → 1 n=76 → 1 n=77 → 1 n=78 → 1 n=79 → 1 n=80 → 1 n=81 → 1 n=82 → 1 n=83 → 1 n=84 → 1 n=85 → 1 n=86 → 1 n=87 → 1 n=88 → 1 n=89 → 1 n=90 → 1 n=91 → 1 n=92 → 1 n=93 → 1 n=94 → 1 n=95 → 1 n=96 → 1 n=97 → 1 n=98 → 1 n=99 → 1 n=100 → 1
Javaソースコードの解説
ここから、ソースコードを上から順番に解説していきます。
001
public class CollatzProblem {
クラス名を、CollatzProblemとしています。
002
public static void main( String[] args ) {
003 004
// 1~100まで確認する for ( int i = 1; i <= 100; i++ ) {
005 006
// nにiを代入 int n =i;
008 009 010 011 012 013 014 015 016 017 018
// 計算を繰り返す // nがコラッツ予想どおり1にならなければループを抜けません for ( ; ; ) { // nが1になったら計算を終了 if ( 1 == n ) break; if ( 0 == ( n % 2 ) ) n = n / 2; // 偶数の処理 else n = n * 3 + 1; // 奇数の処理 }
020 021
// 結果の出力 System.out.println( "n=" + i + " → " + n );
変数iと変数nの値をprintlnメソッドでコンソール出力しています。変数nは全て1です。
Javaソースコード - 途中経過の出力
コラッツ予想の計算の途中経過を出力するJavaソースコードです。
CollatzProblem2.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026
import java.util.Scanner; public class CollatzProblem2 { public static void main( String[] args ) { // キーボードから入力 Scanner scan = new Scanner( System.in ); // 入力した値をnに代入 System.out.print( "整数をキーボードから入力してください:"); int n = scan.nextInt(); // 計算を繰り返す // nがコラッツ予想どおり1にならなければループを抜けません for ( ; ; ) { // nを出力 System.out.println( "n=" + n ); // nが1になったら計算を終了 if ( 1 == n ) break; if ( 0 == ( n % 2 ) ) n = n / 2; // 偶数の処理 else n = n * 3 + 1; // 奇数の処理 } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis CollatzProblem2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac CollatzProblem2.java
実行
C:\talavax\javasample>java CollatzProblem2
実行例 n=70
整数をキーボードから入力してください:70 n=70 n=35 n=106 n=53 n=160 n=80 n=40 n=20 n=10 n=5 n=16 n=8 n=4 n=2 n=1
以上です。