素数

素数

一些定理性质

  • 唯一分解定理

  • 威尔逊定理:

    p p p是质数,则有 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p - 1) ! \equiv -1 \pmod p (p1)!1(modp)

    逆定理同时成立,如果有 ( p − 1 ) ! ≡ − 1 ( m o d p ) (p - 1) ! \equiv -1 \pmod p (p1)!1(modp),则 p p p一定是质数。

    ( ( p − 1 ) ! + 1 ) ≡ 0 ( m o d p ) ((p - 1) ! + 1) \equiv 0 \pmod p ((p1)!+1)0(modp)可以通过 sin ⁡ ( π ( ( n − 1 ) ! + 1 ) / n ) = 0 \sin(\pi((n - 1)! + 1) / n) = 0 sin(π((n1)!+1)/n)=0来得到素数所在点函数。

  • 费马小定理:

    假设 p p p是一个质数, a a a不是 p p p的倍数,则有 a p − 1 ≡ 1 ( m o d p ) a^{p - 1} \equiv 1\pmod p ap11(modp),证明如下

    我们分别取 i ∗ a ( m o d p ) i * a \pmod p ia(modp)的值, f o r i i n r a n g e ( 1 , p ) for i in range(1, p) foriinrange(1,p),由于 i i i p p p互质, a a a p p p互质,所以,这些取模后的值是一个 ( 1   n − 1 ) (1 ~ n - 1) (1 n1)的排列,那么另这 p − 1 p - 1 p1个数相乘,得到的就是 a p − 1 ∗ ( p − 1 ) ! ( m o d p ) = ( p − 1 ) ! a ^ {p - 1} * (p - 1)! \pmod p = (p - 1)! ap1(p1)!(modp)=(p1)!,因为 ( p − 1 ) ! ( m o d p ) ! = 0 (p - 1) ! \pmod p != 0 (p1)!(modp)!=0,所以两边同时约去得到 a p − 1 ≡ 1 ( m o d p ) a ^ {p - 1} \equiv 1 \pmod p ap11(modp)

Miller_Rabin素数测试

利用了 a p ≡ a ( m o d p ) a^{p} \equiv a \pmod p apa(modp),这一性质来对素数进行判定,但是具体的证明我也没仔细看,就是测试一个数字之后就能有 1 / 4 1/ 4 1/4的概率证明其不是质数,然后通过多测试几个数,就可以几乎精确的得到这个数是不是质数。

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}


ll qpow(ll a, ll n, ll mod) {
    ll ans = 1;
    while(n) {
        if(n & 1)   ans = (ans * a) % mod;
        n >>= 1;
        a = (a * a) % mod;
    }
    return ans;
}

bool miller_rabin(ll a) {
    if(a == 2)  return true;
    for(int i = 1; i <= 10; i++) {
        ll temp = rand() % (a - 2) + 2;
        if(qpow(temp, a, a) != temp)    return false;
    }
    return true;
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    srand(time(0));
    ll a;
    while(scanf("%lld", &a) != EOF) {
        if(miller_rabin(a)) puts("prime");
        else    puts("not");
    }
    return 0;
}

欧拉公式与欧拉定理

欧拉公式 ϕ ( n ) = x \phi(n) = x ϕ(n)=x x x x是小于 n n n并且与 n n n互质的数字的个数,有 ϕ ( 8 ) = 4 ( 1 , 3 , 5 , 7 ) \phi(8) = 4 (1, 3, 5, 7) ϕ(8)=4(1,3,5,7)

欧拉公式成立的几个定理:

  • 如果 p p p是质数,则有 ϕ ( p ) = p − 1 \phi(p) = p - 1 ϕ(p)=p1,这是显然成立的。

  • 如果 p p p是质数,则 ϕ ( p i ) = ( p − 1 ) ∗ p i − 1 \phi(p^i) = (p - 1) * p ^ {i - 1} ϕ(pi)=(p1)pi1,证明:

    [ 1 , p i ) [1, p ^ i) [1,pi)之间,与 p p p互质的数有 p ∗ t ( t = 1 , 2 , 3 , … … p i − 1 − 1 ) p* t(t = 1, 2, 3, …… p ^ {i - 1} - 1) pt(t=1,2,3,pi11),所以 ϕ ( p i ) = p i − 1 − ( p i − 1 − 1 ) = ( p − 1 ) ∗ p i − 1 \phi(p^i) = p ^ i - 1 - (p ^ {i - 1} - 1) = (p - 1) * p ^ {i - 1} ϕ(pi)=pi1(pi11)=(p1)pi1

  • ϕ ( n ) = n ∗ ( 1 − 1 / p 1 ) ∗ ( 1 − 1 / p 2 ) … … ( 1 − 1 / p n − 1 ) ∗ ( 1 − 1 / p n ) \phi(n) = n * (1 - 1 / p_1) * (1 - 1 / p_2) …… (1 - 1 / p_{n - 1}) * (1 - 1 / p_{n}) ϕ(n)=n(11/p1)(11/p2)(11/pn1)(11/pn) p i p_i pi n n n的质因数,例如: 8 = 2 3 , ϕ ( 8 ) = 8 ∗ ( 1 − 1 / 2 ) = 4 8 = 2 ^ 3, \phi(8) = 8 * (1 - 1 / 2) = 4 8=23ϕ(8)=8(11/2)=4

  • 如果 a , b a, b a,b互质,则有 ϕ ( a ∗ b ) = ϕ ( a ) ∗ ϕ ( b ) \phi(a * b) = \phi(a) * \phi(b) ϕ(ab)=ϕ(a)ϕ(b),证明:

    可用上述的第三个定理来说明, a , b a, b a,b中的质因数是互质的,所以,任何两个 p i p_{i} pi是互质的,然后显然成立。

欧拉定理

a , m a, m a,m互质有 a ϕ ( m ) ≡ 1 ( m o d m ) a ^ {\phi(m)} \equiv 1 \pmod m aϕ(m)1(modm),当 m m m时质数的时候,也就是 a m − 1 ≡ 1 ( m o d m ) a ^ {m-1} \equiv 1 \pmod m am11(modm)

欧拉筛(素数+欧拉函数)

最后给上素数筛和欧拉函数的线性求解法。

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;

const double eps = 1e-7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    } 
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

const int N = 1e5 + 10;

int prime[N], phi[N], cnt = 0;
bool st[N];

void init() {
    phi[1] = 1;
    for(int i = 2; i < N; i++) {
        if(!st[i]) {
            // cout << i << endl;
            prime[cnt++] = i;
            phi[i] = i - 1;
        }
        for(int j = 0; j < cnt && i * prime[j] < N; j++) {
            st[i * prime[j]] = 1;
            if(i % prime[j] == 0) {
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}


int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    init();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值