• 欧拉定理+费马小定理+快速幂求逆元+欧几里得算法求逆元+线性同余方程


    乘法逆元

          假设  a / b ≡ c (mod p),b * x ≡ 1 (mod p)  

        那么  a * x ≡ c (mod p) 如下图,利用到了模运算对乘法的分配率,因为其中一个的余数恒为1,所以有,((99/3)*(3*7))%10==(((99/3)%10) * ((3*7)%10))%10==(3 * 1)%10==3.

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

    欧拉定理:若 a,p互质,则有a^φ(p)=1(mod p)

    费马小定理:若p为质数,a^p≡a(mod p)等同于 a^p-1≡1(mod p) φ(p)=p-1

    当p为质数时,可以用快速幂求逆元:

    a / b ≡ a * x (mod p)

    两边同乘 b 可得 a ≡ a ^ b ^ x (mod p)

    即 1 ≡ b * x (mod p)

    同 b * x ≡ 1 (mod p)

    由费马小定理可知,当 p 为质数时

    b^(p - 1) ≡ 1 (mod p)

    拆一个 b 出来可得 b * b^(p - 2) ≡ 1 (mod p)

    故当 p 为质数时,b 的乘法逆元 x = b^(p - 2)

    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. typedef pair<int,int>PII;
    5. ll qmi(ll a,ll k,ll p)
    6. {
    7. ll res=1;
    8. while(k)
    9. {
    10. if(k&1) res=res*a%p;
    11. k>>=1;
    12. a=a*a%p;
    13. }
    14. return res;
    15. }
    16. int main()
    17. {
    18. ll a,p;
    19. int t;
    20. scanf("%d",&t);
    21. while(t--)
    22. {
    23. scanf("%lld%lld",&a,&p);
    24. if(a%p==0)
    25. printf("impossible\n");
    26. else
    27. printf("%lld\n",qmi(a,p-2,p));
    28. }
    29. return 0;
    30. }

    欧几里得算法求逆元:

    当ax+by==gcd(a,b)这条式子中a,b互质时,原式相当于ax+by==1,此时有ax≡1(mod b)

    相当于ax≡1(mod p)

    此时有x是a的逆元

    该式子比快速幂求逆元应用范围广,即使p不是质数也成立,但仍然需要a,b互质。

    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. typedef pair<int,int>PII;
    5. void exgcd(ll a,ll b,ll &x,ll &y )
    6. {
    7. if(b==0){ x=1,y=0;return;}
    8. exgcd(b,a%b,x,y);
    9. ll t=x;
    10. x=y;
    11. y=t-y*(a/b);
    12. }
    13. int main()
    14. {
    15. ll a,b,x,y;
    16. int t;
    17. cin>>t;
    18. while(t--)
    19. {
    20. scanf("%lld%lld",&a,&b);
    21. exgcd(a,b,x,y);
    22. cout<
    23. }
    24. return 0;
    25. }

  • 相关阅读:
    Pytest使用fixture实现token共享
    JAVA计算机毕业设计大学生网络创业就业管理系统计算机(附源码、数据库)
    BGP配置和应用案例
    java计算机毕业设计社区养老服务管理系统源程序+mysql+系统+lw文档+远程调试
    Spring复习——day16_SpringMVC_异常处理器
    【commons-lang3专题】004- NumberUtils 专题
    Java代码读取properties配置文件
    C语言学习系列:初识C语言
    Android原生插件开发-Parameters篇
    学生HTML网页作业:基于HTML+CSS+JavaScript画家企业8页
  • 原文地址:https://blog.csdn.net/m0_62327332/article/details/126798310