素數測試(判斷素數)模板

2021-08-09 15:03:52 字數 3158 閱讀 9362

1、素數測試:

#include#includeint modularexponent(int a, int b, int n) 

} return ret;

}bool millerrabin(int n,int a)

int r = 0, s = n - 1, j;

if(!(n%a)) return false;

while(!(s&1))

long long k = modularexponent(a, s, n);

if(k == 1) return true;

for(j = 0; j < r; j++, k = k * k % n)

if(k == n - 1) return true;

return false;

}bool miller_rabin(int n)//

,i;//能通過測試的最小素數為 3215031751(此數超int)

for(i=0;i<4;i++)

return true;

}int main()

return 0;

}

2、大神**

#include#includeint modularexponent(int a, int b, int n) 

} return ret;

}bool millerrabin(int n,int a)

int r = 0, s = n - 1, j;

if(!(n%a)) return false;

while(!(s&1))

long long k = modularexponent(a, s, n);

if(k == 1) return true;

for(j = 0; j < r; j++, k = k * k % n)

if(k == n - 1) return true;

return false;

}bool miller_rabin(int n)//

,i;//能通過測試的最小素數為 3215031751(此數超int)

for(i=0;i<4;i++)

return true;

}int main()

return 0;

}

3、查詢小於等於maxn的素數(生成連續素數表)

/*

* 素數篩選,查詢出小於等於maxn的素數

* prime[0]存素數的個數

*/const int maxn = 100000;

int prime[maxn + 1];

void getprime()

for (int j = 1; j <= prime[0] && prime[j] <= maxn / i; j++)}}

}

4、大數素數測試

#define maxl 4

#define m10 1000000000

#define z10 9

const int zero[maxl - 1] = ;

struct bnum

++i;

len -= z10;

}if (len > 0)}}

bool operator == (const bnum &x)

bnum & operator = (const int x)

bnum operator + (const bnum &x)

return ans;

}bnum operator - (const bnum &x)

else

}return ans;

}// assume *this < x * 2

bnum operator % (const bnum &x)

else if (data[i] > x.data[i])

}return ((*this) - x);

}bnum & div2()

return *this;

}bool is_odd()

bool is_zero()

}return true;

}};void mulmod(bnum &a0, bnum &b0, bnum &p, bnum &ans)

tmp = (tmp + tmp) % p;

b.div2();

}}void powmod(bnum &a0, bnum &b0, bnum &p, bnum &ans)

mulmod(tmp, tmp, p, tmp);

b.div2();

}}bool millerrabintest(bnum &p, int iter)

}if (i == maxl)

if (p.data[0] == 2)

small = 1;

}if (!p.is_odd())

bnum a, s, m, one, pd1;

one = 1;

s = pd1 = p - one;

while (!s.is_odd())

for (i = 0; i < iter; ++i)

else

if (a == one)

powmod(a, s, p, m);

for (j = 0; j < d && !(m == one) && !(m == pd1); ++j)

if (!(m == pd1) && j > 0)

}return true;

}int main()

5、判斷小於maxn得數是不是素數

/*

* 素數篩選,判斷小於maxn的數是不是素數

* notprime是一張表,false表示是素數,true表示不是

*/const int maxn = 1000010;

bool notprime[maxn];

void init()

// 直接從i * i開始就可以,小於i倍的已經篩選過了

for (int j = i * i; j < maxn; j += i)}}

}

線性篩選素數(模板)

今天hz大神回來給我們上課,首先講了線性篩選素數,就先做個記錄吧 以一道模板題為例子 洛谷題號 p3383 模板 線性篩素數 題目描述 如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入輸出格式 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的...

利用孿生素數判斷素數

思路參見 孿生素數 所謂孿生素數指的是間隔為 2 的相鄰素數。大於6以上的孿生素數,p 1和p 1為素數,則p 1和p 1一定為奇數,則p一定為偶數,即p為2的倍數 p 1 p p 1為連續的自然數,他們一定有乙個是3的倍數,p 1和p 1為素數,則他們不為3的倍數,即p也為3的倍數 所以p一定為2...

求素數,判斷素數,篩法

1.判斷素數 時間複雜度 o sqrt n 空間複雜度 o 1 include include sqrt函式標頭檔案 using namespace std bool prime int n return 0 不足之處 很多數被處理了不止1遍,比如6,在素數為2的時候處理1次,為3時候又標記一次,因...