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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数学--数论---P4718 Pollard-Rho算法 大数分解

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学--数论---P4718 Pollard-Rho算法 大数分解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P4718 【模板】Pollard-Rho算法

題目描述
MillerRabin算法是一種高效的質數判斷方法。雖然是一種不確定的質數判斷法,但是在選擇多種底數的情況下,正確率是可以接受的。PollardRho是一個非常玄學的方式,用于在O(n1/4)的期望時間復雜度內計算合數n的某個非平凡因子。事實上算法導論給出的是O(p),p是n的某個最小因子,滿足pp與n/pn/p互質。但是這些都是期望,未必符合實際。但事實上PollardRho算法在實際環境中運行的相當不錯。這里我們要寫一個程序,對于每個數字檢驗是否是質數,是質數就輸出Prime;如果不是質數,輸出它最大的質因子是哪個Miller Rabin 算法是一種高效的質數判斷方法。\\雖然是一種不確定的質數判斷法,但是在選擇多種底數的情況下,正確率是可以接受的。\\ Pollard Rho是一個非常玄學的方式,用于在O(n^{1/4})的期望時間復雜度內計算合數n的某個非平凡因子。\\事實上算法導論給出的是O(\sqrt p),p是n的某個最小因子,滿足pp與n/pn/p互質。但是這些都是期望,未必符合實際。\\但事實上Pollard Rho算法在實際環境中運行的相當不錯。\\ 這里我們要寫一個程序,對于每個數字檢驗是否是質數,是質數就輸出Prime;如果不是質數,輸出它最大的質因子是哪個MillerRabinPollardRhoO(n1/4)n。O(p?)pn滿ppn/pn/pPollardRhoPrime

輸入格式
第一行,TT代表數據組數(不大于350350)

以下TT行,每行一個整數nn,保證1\le n\le 10^{18}1≤n≤10
18
。

輸出格式
輸出TT行。

對于每組測試數據輸出結果。

輸入輸出樣例
輸入 #1復制
6
2
13
134
8897
1234567654321
1000000000000
輸出 #1復制
Prime
Prime
67
41
4649
5
這個題目之考察了計算,沒考察分解,我博客里有帶輸出元素的代碼。

#include <bits/stdc++.h> using namespace std; typedef long long ll; ll pr; ll pmod(ll a, ll b, ll p) { return (a * b - (ll)((long double)a / p * b) * p + p) % p; } //普通的快速乘會T ll gmod(ll a, ll b, ll p) {ll res = 1;while (b){if (b & 1) res = pmod(res, a, p);a = pmod(a, a, p);b >>= 1;}return res; } inline ll gcd(ll a, ll b) { //聽說二進制算法特快if (!a) return b;if (!b)return a;int t = __builtin_ctzll(a | b);a >>= __builtin_ctzll(a);do{b >>= __builtin_ctzll(b);if (a > b){ll t = b;b = a, a = t;}b -= a;} while (b);return a << t; } bool Miller_Rabin(ll n) {if (n == 46856248255981ll || n < 2)return false; //強偽素數if (n == 2 || n == 3 || n == 7 || n == 61 || n == 24251)return true;if (!(n & 1) || !(n % 3) || !(n % 61) || !(n % 24251))return false;ll m = n - 1, k = 0;while (!(m & 1))k++, m >>= 1;for (int i = 1; i <= 20; ++i) // 20為Miller-Rabin測試的迭代次數{ll a = rand() % (n - 1) + 1, x = gmod(a, m, n), y;for (int j = 1; j <= k; ++j){y = pmod(x, x, n);if (y == 1 && x != 1 && x != n - 1)return 0;x = y;}if (y != 1)return 0;}return 1; } ll Pollard_Rho(ll x) {ll n = 0, m = 0, t = 1, q = 1, c = rand() % (x - 1) + 1;for (ll k = 2;; k <<= 1, m = n, q = 1){for (ll i = 1; i <= k; ++i){n = (pmod(n, n, x) + c) % x;q = pmod(q, abs(m - n), x);}t = gcd(x, q);if (t > 1)return t;} } void fid(ll n) {if (n == 1)return;if (Miller_Rabin(n)){pr = max(pr, n);return;}ll p = n;while (p >= n)p = Pollard_Rho(p);fid(p);fid(n / p); } int main() {int T;ll n;scanf("%d", &T);while (T--){scanf("%lld", &n);pr = 0;fid(n);if (pr == n)puts("Prime");elseprintf("%lld\n", pr);}return 0; }

總結

以上是生活随笔為你收集整理的数学--数论---P4718 Pollard-Rho算法 大数分解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。