日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java梅森素数_JAVA基础 第三篇:梅森数、梅森素数、伪素数——素数与指数的完美结合与进阶...

發(fā)布時(shí)間:2024/4/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java梅森素数_JAVA基础 第三篇:梅森数、梅森素数、伪素数——素数与指数的完美结合与进阶... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在前面的章節(jié)中,我們分別討論了質(zhì)數(shù)和指數(shù),今天我們不做其他的,僅僅將它們進(jìn)行整合一下,為什么呢?因?yàn)樵跀?shù)學(xué)領(lǐng)域,有一種特殊的正整數(shù),形如:2^p - 1,其中指數(shù)p為質(zhì)數(shù),這種數(shù)字被稱為梅森數(shù),其中的質(zhì)數(shù)又被稱為梅森素?cái)?shù)。

梅森數(shù)中有一種“變體”——偽素?cái)?shù):2^(p-1)-1,它能被p整除,同時(shí)p又為非偶數(shù)的合數(shù)。

OK,今天我們用JAVA語言來針對這幾個(gè)特殊數(shù)字進(jìn)行編譯。

一、梅森數(shù)

我們先根據(jù)梅森數(shù)的公式自定一個(gè)方法用以計(jì)算梅森數(shù):

/**

* 計(jì)算梅森數(shù)

*

* @param number

* @return

*/

private static BigDecimal calculateMersenneNumber(BigDecimal number) {

// TODO Auto-generated method stub

return integerMi(BigDecimal.valueOf(2), number).subtract(BigDecimal.ONE);

}

上述這個(gè)方法僅僅是用以計(jì)算2^p - 1的結(jié)果,因此我們在main()方法體中編譯代碼時(shí)需要“提取”質(zhì)指數(shù):

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

運(yùn)行結(jié)果:

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

根據(jù)梅森數(shù)的定義我們計(jì)算出了指數(shù)p在前100以內(nèi)的所有梅森數(shù)。

二、梅森素?cái)?shù)

梅森素?cái)?shù)也是梅森數(shù),只不過它將“梅森合數(shù)”舍棄了,因此我們在輸出梅森素?cái)?shù)時(shí)只需在main()方法體中梅森數(shù)的源代碼中加入一個(gè)條件語句,用以限制輸出時(shí)只輸出梅森素?cái)?shù)即可。

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

運(yùn)行結(jié)果:

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

…………………………

它得先計(jì)算,在判斷是否為素?cái)?shù),運(yùn)行時(shí)間相當(dāng)長,因此我只選取了指數(shù)在20以內(nèi)的。

三、偽素?cái)?shù)

同樣,我們先根據(jù)偽素?cái)?shù)的公式自定一個(gè)方法用以計(jì)算偽素?cái)?shù):

/**

* 計(jì)算偽素?cái)?shù)

*

* @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);

}

就如同上述計(jì)算梅森數(shù)和梅森素?cái)?shù)一樣,在編譯main()方法體中的代碼時(shí),我們也需要根據(jù)偽素?cái)?shù)的定義對2的指數(shù)進(jìn)行一定的限制;并且我們多加一個(gè)步驟,就是對其進(jìn)行質(zhì)數(shù)分解。

為此我們編譯出了如下代碼:

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:我們看偽素?cái)?shù)的公式:2^(p-1)-1能被p整除,最小的偽素?cái)?shù)為341,那么帶入公式,其輸出的結(jié)果也是非常大的,因此我們在此省卻此類結(jié)果的輸出,僅僅用公式表達(dá)偽素?cái)?shù)的含義,并且對偽素?cái)?shù)進(jìn)行質(zhì)數(shù)分解。

運(yùn)行結(jié)果:

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:“|”代表前者可以被后者整除。

總結(jié)

以上是生活随笔為你收集整理的java梅森素数_JAVA基础 第三篇:梅森数、梅森素数、伪素数——素数与指数的完美结合与进阶...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。