2024.01.08

数学

コラッツ予想

コラッツ予想の確認

コラッツ予想とは、任意の正の整数nに対して以下の操作を繰り返すと「必ず1になる」という予想です。

・nが偶数の場合、「nを2で割る」

・nが奇数の場合、「nに3を掛けて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ソースコード

以下のソースコードは、整数n=1~100に対してコラッツ予想の計算処理を繰り返して結果が1になることを確認するものです。

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 ) {

このmainメソッドからプログラムを実行します。

003
004
		// 1~100まで確認する
		for ( int i = 1; i <= 100; i++ ) {

int型変数iで1から100までのループを作っています。

005
006
			// nにiを代入
			int n =i;

変数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;	// 奇数の処理
			}

ここから、コラッツ予想どおりになるかを計算しています。

以下の計算を繰り返して整数nが1になったらfor( ; ; )で作成した無限ループを抜けます。

コラッツ予想に反して計算を繰り返しても整数nが1にならない場合、無限ループを抜けません。

・nが偶数の場合、「nを2で割る」

・nが奇数の場合、「nに3を掛けて1を足す」

020
021
			// 結果の出力
			System.out.println( "n=" + i + " → " + n );

変数i変数nの値をprintlnメソッドコンソール出力しています。変数nは全て1です。

以上です。

関連コンテンツ

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

割り算で割り切れずに残った端数を剰余(余り)といいます。この剰余の計算をJavaのソースコードを使って解説しています。

2020.03.23

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

プログラミング、ITに関する用語をまとめています。

2022.10.17

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

繰り返し処理(ループ)から強制的に抜けかたについて解説しています。

2017.07.14

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

自然数と整数って何が違う?

2020.03.23

偶数・奇数を判定する方法を詳しく説明しています。興味のある方は、ご覧ください。

2015.11.17

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

繰り返し処理の作り方を解説しています。

2016.03.02

広告