模运算(带例题详解)

您所在的位置:网站首页 群集运算举例说明例题 模运算(带例题详解)

模运算(带例题详解)

2024-07-05 00:14| 来源: 网络整理| 查看: 265

高次幂求模

传统方法当然就是依次相乘,显然当p很大时,耗时也会很大。

也就是说问题是出在p值太大的情况上,此时我们想到能否将p值缩小,将高次幂指数运算转化为多个低次幂的指数运算乘积。

通过位运算的方法可以很好地解决这个问题: 假 设 我 们 求 2 10 这 个 数 的 值 , 我 们 可 以 将 10 的 二 进 制 数 表 示 出 来 : 1010 。 此 时 我 们 可 以 根 据 位 上 为 1 的 数 的 权 值 对 这 个 指 数 进 行 拆 分 : 2 10 = 2 10 ∗ 2 1000 = 2 2 ∗ 2 8 显 然 上 面 的 等 式 成 立 , 而 此 时 我 们 只 需 遍 历 最 多 4 次 即 可 ( 指 数 的 二 进 制 位 数 ) 。 假设我们求2^{10}这个数的值,我们可以将10的二进制数表示出来:1010。\\ 此时我们可以根据位上为1的数的权值对这个指数进行拆分:2^{10}=2^{10}*2^{1000}=2^2*2^8\\ 显然上面的等式成立,而此时我们只需遍历最多4次即可(指数的二进制位数)。 假设我们求210这个数的值,我们可以将10的二进制数表示出来:1010。此时我们可以根据位上为1的数的权值对这个指数进行拆分:210=210∗21000=22∗28显然上面的等式成立,而此时我们只需遍历最多4次即可(指数的二进制位数)。 代码:

int pow_mod(int a,int b,int c){ int ans = 1; int base = a%c; while(b){ if(b & 1) ans = (ans*base)%c; base = (base*base)%c; b >>= 1; } return ans; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3