Miller-Rabin素數測試

Miller-Rabin素數測試

給出一個小于1e18的數,問它是否為質數?不超過50組詢問。hihocoder

我是真的菜,為了不誤導他人,本篇僅供個人使用。

首先,一個1e18的數,樸素\(O(\sqrt{n})\)素數判定肯定爆炸。怎么辦呢?

我們知道,對于素數p,只要a不是p的倍數,一定有\(a^{p-1}=1\mod p\)。那么,我們是不是可以選出某些a,對于要判定的數p,看看他是否滿足以a為底的費馬小定理,以此來判定質數呢?答案是基本可以。

但是很不巧,有一類合數,以任何小于它們的質數為底進行判定,結果都是正確的。它們叫做偽素數。怎么排除偽素數的情況呢?有個叫做二次探測定理的東西:若\(x^2=1\mod p\),那么\(或x=1或-1\mod p\)

假設\(a^{x-1}=1\mod p\)成立。如果x-1為奇數,就不再判定下去。否則,根據二次探測定理,還可以繼續去判定\(或a^{\frac{x-1}{2}}=1或-1\mod p\)是否成立。如果它不等于1或-1,就返回false。如果它等于-1,就返回true。如果它等于1,就繼續判定下去。反正,只要x-1為偶數,并且\(a^{x-1}=1\mod p\),就可以一直判定。這樣就可以把那些偽素數排除掉了。這就叫做miller-rabin素數測試。據說選前7個質數作為a,在1e18內也只有兩三個會被miller-rabin判定成素數的合數。

#include <cstdio>
using namespace std;typedef long long LL;
const LL m=7, a[m]={2, 3, 5, 7, 11, 13, 17};
LL n, p;LL fmul(LL a, LL b, LL p){  //將b分解為二進制,返回a*b%pLL ans=0;for (; b; b>>=1, a+=a, a%=p)if (b&1) ans+=a, ans%=p;return ans;
}LL fpow(LL a, LL x, LL p){LL ans=1, base=a;for (; x; x>>=1, base=fmul(base, base, p))if (x&1) ans=fmul(ans, base, p);return ans;
}bool MR(LL a, LL x, LL p){  //判斷是否a^x=1或p-1 (mod p),且mr下去也成立LL t=fpow(a, x, p);if (t!=1&&t!=p-1) return false;if (t==1&&x&1||t==p-1) return true;return MR(a, x>>1, p);
}bool isprime(LL p){if (p&1==0) return false;for (LL i=0; i<m; ++i){if (p==a[i]) return true;  //互質時費馬小定理才成立if (fpow(a[i], p-1, p)!=1) return false;if (!MR(a[i], (p-1)>>1, p)) return false;}return true;
}int main(){scanf("%lld", &n);while (n--){scanf("%lld", &p);puts(isprime(p)?"Yes":"No");}return 0;
}

轉載于:https://www.cnblogs.com/MyNameIsPc/p/9314006.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

throws Exception的意思

在方法聲明部分使用&#xff0c;表示該方法可能產生此異常&#xff0c;如果在方法聲明處使用了throws聲明異常&#xff0c;則該方法產生異常也不必捕獲&#xff0c;會直接把異常拋出到調用該方法的地方。

java list按照元素對象的指定多個字段屬性進行排序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 直接提取重點代碼&#xff1a; /*** 把結果集合按時間字段排序&#xff0c;內部類重寫排序規則&#xff1a;* param list* return*/priv…

網絡爬蟲--18.python中的GIL(全局解釋器鎖)、多線程、多進程、并發、并行

參考文獻&#xff1a; python的GIL、多線程、多進程 并發和并行的區別&#xff1f; GIL(全局解釋器鎖)一看就懂的解釋&#xff01; 多謝作者分享&#xff01;

Socket和ServerSocket

對于即時類應用或者即時類的游戲&#xff0c;HTTP協議很多時候無法滿足于我們的需求。這會&#xff0c;Socket對于我們來說就非常實用了。下面是本次學習的筆記。主要分異常類型、交互原理、Socket、ServerSocket、多線程這幾個方面闡述。異常類型在了解Socket的內容之前&#…

徹底搞清楚Android中的 Attr

版權聲明&#xff1a;本文為sydMobile原創文章&#xff0c;轉載請務必注明出處&#xff01; https://blog.csdn.net/sydMobile/article/details/79978187 相信這個詞對于Android開發者來說十分熟悉了&#xff0c;那么你對他到底有多了解呢&#xff1f; 回憶起我剛開始接觸Andr…

D. Relatively Prime Graph

Lets call an undirected graph G(V,E)G(V,E) relatively prime if and only if for each edge (v,u)∈E(v,u)∈E GCD(v,u)1GCD(v,u)1 (the greatest common divisor of vv and uu is 11). If there is no edge between some pair of vertices vv and uu then the value of GC…

解決 : org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.tanj.mapper.SendDeta…

網絡爬蟲--19.【Scrapy-Redis實戰】分布式爬蟲爬取房天下--環境準備

文章目錄0. 思路一. 虛擬機Ubuntu0中安裝Redis二. 虛擬機Ubuntu1中安裝Redis三. Windows服務器上安裝Redis四. 安裝cmder五. 安裝RedisDesktopManager六. 修改Windows中的配置文件redis.windows.conf七. Ubuntu連接Windows上 的Redis服務器-----------------------------------…

開發人員,請愛護你的身體

最近一周身體極度不適&#xff0c;口腔潰瘍、嗓子痛、感冒咳嗽、發燒&#xff0c;統統來了一個遍&#xff0c;非常痛苦。所以最近一直關注有關于軟件開發人員的身體健康問題的網站、文章。 看了許多文章&#xff0c;在結合自己在這一周之內痛苦的感受&#xff0c;所以才寫這樣…

tkinter中scale拖拉改變值控件(十一)

scale拖拉改變值控件 使用戶通過拖拽改變值 簡單的實現&#xff1a; 1 import tkinter2 3 wuya tkinter.Tk() 4 wuya.title("wuya") 5 wuya.geometry("300x2001020") 6 7 8 # 創建對象 9 scale1 tkinter.Scale(wuya, from_0, to100) 10 scale1.pac…

vue+elementUI開發實踐問題總結

最近公司項目采用vue&#xff0c;實行前后端分離開發&#xff0c;采用element-ui框架&#xff0c;對于項目中遇到的問題進行記錄&#xff0c;便于日后查詢。 vueelementui怎樣點擊table中的單元格觸發事件&#xff1f;官方文檔是采用的cell-click方式。實際項目中需要在不同的t…

Socket的getInputStream()方法

Socket的getInputStream()方法可以獲得網絡連接輸入&#xff0c;同時返回一個InputStream實例 。

計算機圖形學理論(4):緩沖區

本系列根據國外一個圖形小哥的講解為本&#xff0c;整合互聯網的一些資料&#xff0c;結合自己的一些理解。 什么是緩沖區&#xff1f; 緩沖區是保存某些數據的臨時存儲空間。 為什么我們需要緩沖區&#xff1f;原因很簡單&#xff0c;當數據量很大時&#xff0c;因為計算機無…

解決:Every derived table must have its own alias

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias 解決&…

網絡爬蟲--20.【Scrapy-Redis實戰】分布式爬蟲獲取房天下--代碼實現

文章目錄一. 案例介紹二.創建項目三. settings.py配置四. 詳細代碼五. 部署1. windows環境下生成requirements.txt文件2. xshell連接ubuntu服務器并安裝依賴環境3. 修改部分代碼4. 上傳代碼至服務器并運行一. 案例介紹 爬取房天下&#xff08;https://www1.fang.com/&#xff…

同一臺電腦安裝python2python3

【安裝之前&#xff0c;先了解一下概念】 python是什么&#xff1f; Python是一種面向對象的解釋型計算機程序設計語言&#xff0c;由荷蘭人Guido van Rossum于1989年發明&#xff0c;第一個公開發行版發行于1991年。 Python是純粹的自由軟件&#xff0c; 源代碼和解釋器CPytho…

程序員的常見健康問題

其實這些問題不僅見于程序員&#xff0c;其他長期經常坐在電腦前的職場人士&#xff08;比如&#xff1a;網絡編輯、站長等&#xff09;&#xff0c;都會有其中的某些健康問題。希望從事這些行業的朋友&#xff0c;對自己的健康問題&#xff0c;予以重視。以下是全文。 我最近…

Java中BufferedReader和InputStreamReader

BufferedReader 類BufferedReader 由Reader類擴展而來&#xff0c;提供通用的緩沖方式文本讀取&#xff0c;而且提供了很實用的readLine&#xff0c;讀取一個文本行&#xff0c;從字符輸入流中讀取文本&#xff0c;緩沖各個字符&#xff0c;從而提供字符、數組和行的高效讀取。…

網絡爬蟲--21.Scrapy知識點總結

文章目錄一. Scrapy簡介二. Scrapy架構圖三. Scrapy框架模塊功能四. 安裝和文檔五. 創建項目六. 創建爬蟲一. Scrapy簡介 二. Scrapy架構圖 三. Scrapy框架模塊功能 四. 安裝和文檔 中文文檔&#xff1a;https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html …

Spring 定時任務的幾種實現

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 近日項目開發中需要執行一些定時任務&#xff0c;比如需要在每天凌晨時候&#xff0c;分析一次前一天的日志信息&#xff0c;借此機會整…