求a的b次方、a的b次方对m取模

2024-06-03 19:32
文章标签 次方 取模

本文主要是介绍求a的b次方、a的b次方对m取模,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

求a的b次方、a的b次方对m取模


 
  • 快速计算乘方的算法,求a的b次方


如计算2^13,则传统做法需要进行12次乘法,但是可以优化:
把2*2的结果保存起来看看,是不是成了:4*4*4*4*4*4*2 
再把4*4的结果保存起来:16*16*16*2 
一共5次运算,分别是2*2、4*4和16*16*16*2 

这样分析,我们算法因该是只需要计算一半都不到的乘法了。 
为了讲清这个算法,再举一个例子2^7:2*2*2*2*2*2*2 
两两分开:(2*2)*(2*2)*(2*2)*2 
如果用2*2来计算,那么指数就可以除以2了,不过剩了一个,稍后再单独乘上它。 
再次两两分开,指数除以2: ((2*2)*(2*2))*(2*2)*2 
实际上最后一个括号里的2 * 2是这回又剩下的,那么,稍后再单独乘上它 
现在指数已经为1了,可以计算最终结果了:16*4*2=128

[cpp]   view plain copy
  1. long my_power(long a,long b)  
  2.  
  3.     long r=1; //用来计算"剩下的"乘积   
  4.     if(b==0)  
  5.         return 1;  
  6.     if(b<0)  
  7.         return 0;  
  8.     while(b>1)  
  9.     {// 一直计算到指数小于或等于1   
  10.         if((b&1)!=0) //判断p是否奇数,偶数的最低位必为0  
  11.             r*=a; // 若r为奇数,则把"剩下的"乘起来  
  12.         *=a;// 主体乘方  
  13.         b/=2;// 指数除以2              
  14.      
  15.     return r*a;// 最后把主体和“剩下的”乘起来作为结果      
  16.  


  • 求x的y次方对z取模(x^y)mod z:蒙格马利快速幂模算法
X^Y可以看作Y个X相乘,即然有积模分解公式,那么我们就可以把Y个X相乘再取模的过程分解开来,比如:(17^25))则可分解为:( ( 17 * 17 ) % 29 * ( 17 * 17 ) % 29 * …… 

如果用上面的代码将这个过程优化,那么我们就得到了著名的蒙格马利快速幂模算法:

[cpp]   view plain copy
  1. long Montgomery(long a,long b,long m)  
  2.  
  3.     long r=1;  
  4.     %=m;  
  5.     while(b>1)  
  6.      
  7.         if((b&1)!=0)  
  8.             (r*a)%m;  
  9.         (a*a)%m;  
  10.         b/=2;      
  11.      
  12.     return (r*a)%m;      
  13.  

这篇关于求a的b次方、a的b次方对m取模的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027906

相关文章

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

剑指offer__04__数值的整数次方

题目 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不考虑大数问题 需要注意的地方 基数为 0 ,指数为负的情况优化计算的次数,利用指数相乘的性质判断奇偶性使用位运算,节约计算量 代码 public class Solution {public double Power(double base, int exp

Pytorch:Tensor基本运算【add/sub/mul/div:加减乘除】【mm/matmul:矩阵相乘】【Pow/Sqrt/rsqrt:次方】【近似:floor...】【裁剪:clamp】

一、基本运算:加减乘除 1、乘法 1.1 a * b:element-wise 对应元素相乘 a * b:要求两个矩阵维度完全一致,即两个矩阵对应元素相乘,输出的维度也和原矩阵维度相同 1.2 torch.mul(a, b):element-wise 对应元素相乘 torch.mul(a, b):是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1,

c++习题28-计算2的N次方

目录 一,题目 二,思路 三,代码 一,题目 描述 任意给定一个正整数N(N<=100),计算2的n次方的值。 输入描述 输入一个正整数N。 输出描述 输出2的N次方的值。 用例输入 1  5 用例输出 1  32 二,思路 以2为底的指数如下:       0    1 1    2 2    4  3    8 4   16 5   32 6

排列数+时间戳+逆元取模

前言:这个题目是真的难,不会做,看了题解才发现是咋回事 题目地址 最主要的就是为啥是除以3,c之前需要完成a 和 b,d 和 e 对我们的答案没有影响,所以我们要除以 A(3,3) ,但是 a 和 b 的排列没有要求,所以乘以 A( 2 , 2 ) 抵消得到 3 #include<bits/stdc++.h>using i64 = long long;using u64 =

剑指offer:数值的整数次方(python)

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 # -*- coding:utf-8 -*-class Solution:def Power(self, base, exponent):# write code hereflag = 0if base==0:return Falseif exponent==0

CSU - 1556 Jerry's trouble(快速幂取模)

【题目链接】:click here 【题目大意】:计算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 <= m < 1000) 【解题思路】:快速幂取模 代码: solution one: #include<bits/stdc++.h>#define LL long longusing namespace std;const

UESTC 1712 Easy Problem With Numbers 除法对和数取模,分解,线段树

附上神牛原版思路: 如果这个题只有乘法,那么你肯定会做吧?线段树更新区间查找区间。 那么有除法呢?当一个数x和m互质的时候,除以x可以改为乘以x的逆元。(至于互质的数求逆元用扩展欧几里德,这个网上可以随便找到) 但是这题并不能保证除的数与m互质吧?什么时候x与m不互质呢?就是x与m含有公因子吧? 那么我们一开始就把m分解,分解出来m有p1,p2,p3,p4...pn等一

C++ | Leetcode C++题解之第372题超级次方

题目: 题解: class Solution {const int MOD = 1337;int pow(int x, int n) {int res = 1;while (n) {if (n % 2) {res = (long) res * x % MOD;}x = (long) x * x % MOD;n /= 2;}return res;}public:int superPow(in

Golang | Leetcode Golang题解之第372题超级次方

题目: 题解: const mod = 1337func pow(x, n int) int {res := 1for ; n > 0; n /= 2 {if n&1 > 0 {res = res * x % mod}x = x * x % mod}return res}func superPow(a int, b []int) int {ans := 1for _, e := rang