正在计算 (a^b)%MOD
Calculating (a^b)%MOD
我想编写代码来计算pow(a,b)%MOD的值。我使用C++来编码。
但问题是b的值可以非常大。我知道log(b)时间复杂度方法。但是,b 的值可能不适合 C++ 的数据类型"long long"。例如,b 可以是第 1000000000 个斐波那契数。精确计算这么大的数字本身是不可能的(在时间限制内)。
附言 :
- pow(a,b) 表示 a*a*a*a*...B倍。 X
- % MOD 表示将 X 除以 MOD 时获得的余数。
这是一个典型的任务。请(或者,真的,请!)阅读欧拉全能函数。
然后是欧拉定理。
问题是你可以显着地将a^b减少到a^(b % phi(MOD))。是的,您将需要某种整数分解方法,但是仍然没有关于实际计算所需功率的疯狂想法。
我们在我年轻时手工制作了这样的样品:) 即使数字远远超出32/64位范围。
编辑:好吧,你生活和学习。2008年的结果是:
"totient 是 gcd 的离散傅里叶变换:(Schramm (2008))"
因此,要计算phi(b),不需要知道其因子。
编辑(2):
卡迈克尔函数是你需要计算的,以获得任何a,b和MOD的正确答案。
我用这个函数来解决这个问题
UVA 374 - 大模组
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=310
// a^b % T
// with Exponentiation by squaring (http://en.wikipedia.org/wiki/Exponentiation_by_squaring#Basic_method)
// if a very large use
// R=(unsigned long long)(R*a)%T;
int restOfPot(long long a,int b,int T)
{
a%=T;
long long R=1;
while(b)
{
if(b&1) R=(R*a)%T;
a=(a*a)%T;
b>>=1;
}
return int(R);
}
要处理非常大的数字,请查看boost的多精度库。它有一个 powm() 函数,可以很好地用于此目的。
从泛型整数运算:
template <class Integer> Integer powm(const Integer& b, const Integer& p, const Integer& m);
返回 bp % m。
例:
#include <boost/multiprecision/cpp_int.hpp>
boost::multiprecision::cpp_int pow("8912627233012800753578052027888001981");
boost::multiprecision::cpp_int mod("0x86f71688cdd2612c117d1f54bdae029");
boost::multiprecision::cpp_int base(12345);
boost::multiprecision::cpp_int result = powm(base, pow, mod);
std::cout << "result is: " << result << std::endl;
指纹:
result is: 5758534182572671080415167723795472693
第一:C/C++ 中的^
不是幂的运算符。事实上,这没有运算符。 ^
表示按位 XOR。您必须使用可以在标题中找到的pow(base, exp)
math.h
或 cmath
.
对于如此巨大的数字,使用double
或long double
(确切的长度和生成的数据类型可能因您的平台而异),但在某些时候您会偶然发现精度问题,因此根据您的用例,您最好的选择可能是使用自定义数据类型的值大小(编辑:例如,来自其中一个链接问题中找到的库之一)。
我建议使用专门的数学库。这也看起来像加密,所以我建议使用加密库。GNU一定会有一个你可以使用的。这是因为在许多情况下,在加密中,可能会选择指数以使用普通数学库无法假设的快捷方式进行有效计算。
但是,b 的值可能不适合 C++ 的数据类型"long long"。例如,b 可以是第 1000000000 个斐波那契数。
对于这样的事情,有一个简单的解决方法:召回
a^(b+c) == a^b * a^c mod d
你可以用与计算斐波那契数相同的递归来计算你所询问的特定乘积——你根本不需要大数或模幂!
有时出现的另一个版本是
a^(b*c) = (a^b)^c mod d
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define ll long long
ll power(ll x, ll y)
{
if ( y == 0)
return 1;
ll temp = power(x, y / 2);
if (y % 2 == 0)
return (temp * temp) % mod;
else
return (((temp * temp) % mod) * x) % mod;
}
ll dmod(ll x)
{
return ((x + mod) % mod);
}
ll modular_power(ll x, ll y)
{
ll ans = 1;
while (y)
{
if (y & 1)ans = dmod(ans * x);
y /= 2;
x = dmod(x * x);
}
return ans;
}
int main()
{
ll a, b;
cin >> a >> b;
ll ans1 = modular_power(a, b);
ll ans2 = power(a, b);
// both answers are same
cout << ans1 << " " << ans2 ;
}
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 使用加法链接计算 (a^x)mod n.C++算法
- 当n变大时,在计算阶乘(N)mod m上遇到困难
- 如何在不到1秒的时间内计算2^x mod n=1
- 用mod和pow计算大数字
- 正在计算 (a^b)%MOD
- 计算 n,其中 a^n mod m = 1
- 用mpz_powm计算功率mod
- 利用模乘逆的概念计算nCr % MOD