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時候又標記一次,因...