zoukankan      html  css  js  c++  java
  • a^b mod p

    a^b

    基础知识

    求模就是取余

    代码原理

    例 3 ^ 7 mod 5
    7 = 111
    3 ^ 7 = 3^(111) = (3^001) * (3^010) * (3^100) = (3^1) * (3^2) * (3^4)

    3 ^ 001 = 3 ^ 1 = 3
    3 ^ 010 = (3 ^ 1)^2 = 9
    3 ^ 100 = (3 ^ 2)^2 = 81 //每个乘式都是上一个乘式结果的平方

    3 ^ 7 mod 5的一般计算过程如下

    3^1 % 5 = 3
    3 * 3^2 % 5 = 2
    2 * 3^4 % 5 = 2

    然后拆开

    第一步

    3 % 5 = 3

    第二步-> 3 * 9 % 5 = 2拆开

    3 * 3 % 5 = 9 % 5 = 4 //先将9%5计算出来,然后3 * 4%5
    3 * 4 % 5 = 2      

    第三步 -> 2 * 81 % 5 = 2 拆为

    4 * 4 % 5 = 1 //为什么是 4 * 4而不是9 * 9 
    2 * 1 % 5 = 2

    这里为什么是4 * 4而不是9 * 9,我们看出每步求余中的数都是上一次结果的平方,
    4是由9%5=4也就是第二步计算得出,第三步对应位置本应是9 * 9%5
    展开得(5+4) * (5+4)%5=((5 * 5)+(5 * 4)+(4 * 5)+(4 * 4))%5=4 * 4%5
    也就是说如果被除数中已经有单位个余数,那么这个数无论乘谁,原本可整除被除数的那部分都是仍可整除被除数的,而改变余数的是原本就不能整除被除数的那部分。
    比如18%7=2....4
    那么(18 * n)%7==(4 * n)%7
    所以说如果这个题改成3^15mod5
    那么就应该还有第四步
    1 * 1%5=1
    1 * 2%5=2

    代码

    #include<iostream>
    using namespace std;
    int main(){
        int a , b  , p ;
        int ans = 1 % p;
        while(b){
            if(b&1) ans = ans * a % p;
            a = a * a  % p ;
            b >>=1;
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    JAVA核心技术笔记总结--第14章 线程总结
    java核心技术笔记——第 9 章 集合
    Java核心技术笔记——第 8 章 泛型
    2.面向对象三大特征
    1.浅谈面向对象思想
    8.字符串
    7.数组
    6.调试程序
    5.流程控制语句
    4.运算符
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/10293494.html
Copyright © 2011-2022 走看看