我有一些C#应用程序:
double n = p * q;
double S = Math.Pow(M, d) % n;
在我的情况下,M == 7,d == 27,n = 55.我在Windows默认计算器中计算它,得到28.但是我的应用程序返回14.为什么?
答案 0 :(得分:4)
double
最多具有16位精度,但7^27
是一个23位数字,因此您在求幂中失去精度。 Windows计算器支持超越函数的32位精度(如pow
),因此它可以在不损失精度的情况下执行计算。
你可以使用(a^b) % N
与((a%n) ^ b) % n
相同的数学事实,但你仍下雨的数字更大然后是2到27的幂,它不能在double
中精确表示。
另一种选择是将权力分成多个指数,可以<{>}在double
中表示,而不会损失精确度:
7^27 = 7^9 * 7^9 * 7^9
7^27 % 55 = ((7^9) % 55 * (7^9) % 55 * (7^9) % 55) % 55
= (52 * 52 * 52) % 55
= 140,608 % 55
= 28
答案 1 :(得分:4)
正如D Stanley所提到的,double
只有16位精度。您需要使用BigInteger
。这是在.NET 4.5和4.6中。您需要添加对System.Numerics
BigInteger test = BigInteger.Pow(7, 27) % 55;