zoukankan      html  css  js  c++  java
  • 快速幂/分数取模简介

    快速幂

    快速幂所要做的,就是求出 (a^bmod p) 的值。由于 (b) 往往很大,以至于超过 (10^7) ,使得普通的 (O(n)) 求幂算法可行度不高,因此要用到快速幂。
    快速幂的原理也很简单,就是将 b 逐渐化小,从而做到以 (O(log_2(n))) 的复杂度完成:

    对于式子 (a^{2b+1}mod p),可以转化为 ({(a^2) mod p}^b imes bmod p)
    而对于 (a^{2b}mod p),则转化为 ({(a^2)}^bmod p)

    经过若干次转化使得 (b=0),此时就得到了答案。

    Code:

    #define int long long
    const int mod=192600817 
    int qsm(int x,int y)
    {
        int res=1;
        while(y)
        {
            if(x&1)
                res=(res*x)%mod;
            x=(x*x)%mod;
            y>>=1;
        }
        return res;
    }
    

    分数取模

    此处的分数取模,所求的是 (a/b mod p) 的值,因为与余数相关的除法不像加减乘这样可以直接计算,所以需要用到其他方法。

    我们可以将这个十字转化为 (a imes b^{-1} mod p),又根据费马小定理,可以转换为 (a imes b^{(p-2)} mod p),这就可以用快速幂解决了。

    Code:

    #define int long long
    const int mod=192600817 
    int qsm(int x,int y)
    {
        int res=1;
        while(y)
        {
            if(x&1)
                res=(res*x)%mod;
            x=(x*x)%mod;
            y>>=1;
        }
        return res;
    }
    int MOD(int x,int y)
    {
        return x%mod*qsm(y,mod-2)%mod;
    }
    
  • 相关阅读:
    虚拟机黑屏
    ngnix随笔三
    ngnix随笔二
    ngnix随笔一
    HTML(初级)笔记
    学习Java注解
    常用工具类与commons 类库
    SpringBoot缓存使用
    LeetCode:98.验证二叉搜索树
    剑指Offer:面试题07.重建二叉树
  • 原文地址:https://www.cnblogs.com/Orzlky/p/KUAISIMI_FENSHUQUMO.html
Copyright © 2011-2022 走看看