JAVA基礎第三編:メイソン数、メイソン素数、偽素数--素数と指数の完璧な結合と進級


前の章では、質量数と指数をそれぞれ議論しましたが、今日は他のことをしないで、それらを統合するだけです.なぜですか.数学の分野では、2^p-1のような特殊な正の整数があるため、指数pは質量数であり、この数字はメイソン数と呼ばれ、その中の質量数はメイソン素数とも呼ばれている.
メイソン数には「変体」--偽素数:2^(p-1)-1があり、pによって除去され、同時にpは非偶数の合数である.
OK、今日はJAVA言語でこれらの特殊な数字をコンパイルします.
一、メイソン数
まず、メイソン数の式に基づいて、メイソン数を計算する方法を定義します.
	/**
	 *      
	 * 
	 * @param number
	 * @return
	 */
	private static BigDecimal calculateMersenneNumber(BigDecimal number) {
		// TODO Auto-generated method stub
		return integerMi(BigDecimal.valueOf(2), number).subtract(BigDecimal.ONE);
	}

上記の方法は2^p-1の結果を計算するためにのみ使用されるため、main()メソッドボディでコードをコンパイルする際に「抽出」質量指数が必要です.
		for (BigDecimal a = BigDecimal.valueOf(2); a.compareTo(BigDecimal.valueOf(100)) <= 0; a = a.add(BigDecimal.ONE))
			if (primeNumber(a))
				System.out.println("2 ^ " + a + " - 1 = " + calculateMersenneNumber(a));

実行結果:
2 ^ 2 - 1 = 3
2 ^ 3 - 1 = 7
2 ^ 5 - 1 = 31
2 ^ 7 - 1 = 127
2 ^ 11 - 1 = 2047
2 ^ 13 - 1 = 8191
2 ^ 17 - 1 = 131071
2 ^ 19 - 1 = 524287
2 ^ 23 - 1 = 8388607
2 ^ 29 - 1 = 536870911
2 ^ 31 - 1 = 2147483647
2 ^ 37 - 1 = 137438953471
2 ^ 41 - 1 = 2199023255551
2 ^ 43 - 1 = 8796093022207
2 ^ 47 - 1 = 140737488355327
2 ^ 53 - 1 = 9007199254740991
2 ^ 59 - 1 = 576460752303423487
2 ^ 61 - 1 = 2305843009213693951
2 ^ 67 - 1 = 147573952589676412927
2 ^ 71 - 1 = 2361183241434822606847
2 ^ 73 - 1 = 9444732965739290427391
2 ^ 79 - 1 = 604462909807314587353087
2 ^ 83 - 1 = 9671406556917033397649407
2 ^ 89 - 1 = 618970019642690137449562111
2 ^ 97 - 1 = 158456325028528675187087900671

メイソン数の定義に基づいて,指数pが上位100以内のすべてのメイソン数を計算した.
二、メイソン素数
メイソン素数もメイソン数ですが、「メイソン合数」は捨てられているので、メイソン素数を出力するときはmain()メソッド体にメイソン数のソースコードに条件文を入れるだけで、出力を制限するときにメイソン素数だけを出力すればいいのです.
		for (BigDecimal a = BigDecimal.valueOf(2); a.compareTo(BigDecimal.valueOf(100)) <= 0; a = a.add(BigDecimal.ONE))
			if (primeNumber(a) && primeNumber(calculateMersenneNumber(a)))
				System.out.println("2 ^ " + a + " - 1 = " + calculateMersenneNumber(a));

実行結果:
2 ^ 2 - 1 = 3
2 ^ 3 - 1 = 7
2 ^ 5 - 1 = 31
2 ^ 7 - 1 = 127
2 ^ 13 - 1 = 8191
2 ^ 17 - 1 = 131071
2 ^ 19 - 1 = 524287
…………………………

素数かどうかを判断するために、運転時間がかなり長いので、指数が20以内のものだけを選びました.
三、疑似素数
同様に、疑似素数の式に基づいて、疑似素数を計算する方法を定義します.
	/**
	 *      
	 * 
	 * @param number
	 * @return
	 */
	private static BigDecimal calculatePseudoPrimeNumber(BigDecimal number) {
		// TODO Auto-generated method stub
		return integerMi(BigDecimal.valueOf(2), number.subtract(BigDecimal.ONE)).subtract(BigDecimal.ONE);
	}

上記のようにメイソン数とメイソン素数を計算するように、main()メソッド体のコードをコンパイルする際にも、偽素数の定義に基づいて2の指数を一定の制限する必要がある.さらに、質量分解を行うステップを追加します.
このため、次のコードをコンパイルしました.
		for (BigDecimal a = BigDecimal.valueOf(2);; a = a.add(BigDecimal.ONE))
			if (calculatePseudoPrimeNumber(a).remainder(a).equals(BigDecimal.ZERO) && !primeNumber(a)
					&& a.remainder(BigDecimal.valueOf(2)).equals(BigDecimal.ONE)) {
				System.out.print("2 ^ ( " + a + " - 1 ) - 1 | " + a + " = ");
				divisorPrime(a);
				System.out.println();
			}

PS:疑似素数の式を見る:2^(p-1)-1はpで除去され、最小の疑似素数は341であり、式に持ち込まれ、その出力の結果も非常に大きいため、ここではこのような結果の出力を省き、式だけで疑似素数の意味を表現し、疑似素数を質数分解する.
実行結果:
2 ^ ( 341 - 1 ) - 1 | 341 = 11 * 31
2 ^ ( 561 - 1 ) - 1 | 561 = 3 * 11 * 17
2 ^ ( 645 - 1 ) - 1 | 645 = 3 * 5 * 43
2 ^ ( 1105 - 1 ) - 1 | 1105 = 5 * 13 * 17
2 ^ ( 1387 - 1 ) - 1 | 1387 = 19 * 73
2 ^ ( 1729 - 1 ) - 1 | 1729 = 7 * 13 * 19
2 ^ ( 1905 - 1 ) - 1 | 1905 = 3 * 5 * 127
2 ^ ( 2047 - 1 ) - 1 | 2047 = 23 * 89
2 ^ ( 2465 - 1 ) - 1 | 2465 = 5 * 17 * 29
2 ^ ( 2701 - 1 ) - 1 | 2701 = 37 * 73
2 ^ ( 2821 - 1 ) - 1 | 2821 = 7 * 13 * 31
………………………………

PS:"|"は前者を後者によって除去することができることを意味する.