• 1492: 费马定理 (快速幂)


    1492: 费马定理

    http://www.acmore.net/problem.php?id=1492

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 82  Solved: 14

    Description

    以数学家命名的定理有很多,其中费马定理就是其中之一,费马定理表明如果一个素数p不能整除整数a那么a^(p-1)%p=1恒成立。试验可知p-1并不一定是该式成立的最小指数,那么你能找出最小的指数x满足a^x%p=1吗?

    Input

    若干组测试数据,每组数据占一行共两个整数a(1<=a<=10^9),p(2<=p<=10^9),p是素数且不能整除a。

    Output

    输出最小的x使得a^x%p=1成立。

    Sample Input

    5 11 6 11

    Sample Output

    5 10

    HINT

     

    Source

    Lyush

    数学题,由于已经告知费马定理的存在,那么可以证明最小的满足要求的x一定是p-1的因子。可以假设如果x不是p-1的因子的话,那么令p-1=k*x+r,那么有a^(k*x) * a^r % p = 1,显然a^(k*x)%p = 1,而由于a^(p-1) % p = 1,所以a^r % p = 1,而0 < r < x并且x是满足条件最小的值,因此假设不成立。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    
    long long mod;
    int a,p;
    
    int Pow(long long m,int k){
        long long ans=1;
        while(k){
            if(k&1){
                ans*=m;
                ans%=mod;
            }
            m*=m;
            m%=mod;
            k>>=1;
        }
        return ans;
    }
    
    int solve(){
        p--;
        int ans=INF;
        for(int i=1;i*i<=p;i++)
            if(p%i==0){     //最小的满足要求的x一定是p-1的因子
                if(Pow(a,i)==1)
                    ans=min(ans,i);
                if(Pow(a,p/i)==1)
                    ans=min(ans,p/i);
            }
        return ans;
    }
    
    int main(){
    
        freopen("input.txt","r",stdin);
    
        while(~scanf("%d%d",&a,&p)){
            mod=p;
            printf("%d\n",solve());
        }
        return 0;
    }
  • 相关阅读:
    线性代数学习路线
    补充.关于秩的不等式
    第十讲.无关性、基与维数
    第九讲.Ax = b
    第八讲.Ax = 0
    大三下学期第一个月反思
    第六讲.LU分解
    第五讲.矩阵的逆
    第四讲.矩阵的运算
    NAT 实验
  • 原文地址:https://www.cnblogs.com/jackge/p/3019266.html
Copyright © 2020-2023  润新知