- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试了解 Java 的 BigInteger 类的 modPow 和 modInverse 的行为,因为它们并不像我预期的那样工作。也许我遗漏了一些简单的东西,所以这里有一段非常简单的代码:
BigInteger a = BigInteger.valueOf(2);
BigInteger b = BigInteger.valueOf(5);
BigInteger n1 = new BigInteger(32, 100, new SecureRandom());
System.out.println("n = " + n1);
System.out.println("a^b = " + a.modPow(b, n1) + " ;; (a^b)^(b^-1) = " + a.modPow(b, n1).modPow(b.modInverse(n1), n1));
我得到的输出是:
n = 2664021049 (This is a random prime, can change each run)
a^b = 32 ;; (a^b)^(b^-1) = 4
现在,我希望最后一行的 4
是 2
,因为它是 (a^b)^(1/b) = a^(b*(1/b)) = a
这也适用于模域吗?
我做错了什么?
最佳答案
简答:反转b
国防部 p-1
, 不是模组 p
. (如果 b
不是可逆模 p-1
,则问题无解。)
如果 x ≡ y (mod p)
是这样的话, 然后 x^z ≡ y^z (mod p)
,我们不能得出结论 z^x ≡ z^y (mod p)
.例如,由费马小定理,
x^p ≡ x (mod p)
即使p ≡ 0 (mod p)
, 和 x^0 = 1
.
然而,费马小定理给了我们一个解决方案。对于整数 x
和 y
和素模 p
,如果我们能找到一个乘法逆元 z
对于 y
mod p-1
,然后
(x^y)^z = x^(yz)
= x^(k(p-1) + 1) for some k
= (x^(p-1))^k * x
如果x ≡ 0 (mod p)
, 然后 (x^(p-1))^k * x ≡ x (mod p)
因为两边都等于 0。
如果x !≡ 0 (mod p)
, 那么我们可以导出 x^(p-1) ≡ 1 (mod p)
来自 x^p ≡ x (mod p)
,我们有 (x^(p-1))^k * x ≡ 1^k * x ≡ x (mod p)
.
因此,(x^y)^z ≡ x (mod p)
.
另一方面,如果y
不是可逆模组 p-1
,然后事实证明我们无法恢复 x
来自 x^y
,因为有多个可能的 x
值。例如,使用 x = 2, y = 3, p = 7
, 我们有 x^y ≡ 1 (mod p)
,但是 x
本来可以是 1
.
关于Java BigInteger modInverse 和 modPow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41137878/
我正在尝试这个: BigInteger.ModPow(x, -1, z); 但此方法不能使用 -1 作为 Pow 参数。在 C# 中是否有任何已经实现的类可以做到这一点,或者我需要创建自己的类? 最佳
我正在使用 .NET BigInteger类来执行一些数学运算。然而 ModPow方法给我错误的结果。我将它与我认为正确的 Java 进行了比较: // C# var a = new BigInteg
好吧,我正在尝试将方法从 Java 转换为 C#,但是 C# 中的 modPow 需要 3 个参数,而 Java 中只需要 2 个参数?如何将以下内容转换为 C# - BigInteger var6
我正在尝试了解 Java 的 BigInteger 类的 modPow 和 modInverse 的行为,因为它们并不像我预期的那样工作。也许我遗漏了一些简单的东西,所以这里有一段非常简单的代码: B
我需要计算 BigInteger modPow,但使用 BigDecimal 作为指数。 在这种情况下,无法转换为 double 或使用 BigDecimal.pow 然后取模,因为没有取模的完整结果
我正在寻找一个快速的(特别是 p^n mod g 操作,应该用蒙哥马利实现)大整数库。我知道有 GMP,但 GMP 是 LGPL,不符合我的要求。 我试过了 http://www.acme.com/s
我正在尝试使用 Boost 在 C++ 中为 AWS Cognito 重新实现 SRP 协议(protocol),并查看 Amazon 的 Android 实现。 我遇到了一个问题,即具有相同参数的
我必须将一些加密代码从我不太熟悉的 java (visual c++) 移植到 visual c++。我在 http://sourceforge.net/projects/cpp-bigint/ 找到
我是一名优秀的程序员,十分优秀!