- 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/
是否有内置函数可以让我计算 a(mod n) 的模逆?例如19^-1 = 11 (mod 30),在本例中为 19^-1 == -11==19; 最佳答案 由于 .Net 4.0+ 使用特殊的模块化算
我收到此错误消息: Exception in thread "main" java.lang.ArithmeticException: BigInteger not invertible. 这很奇怪,
我正在尝试了解 Java 的 BigInteger 类的 modPow 和 modInverse 的行为,因为它们并不像我预期的那样工作。也许我遗漏了一些简单的东西,所以这里有一段非常简单的代码: B
我想计算 C(n, k) 的组合,其中 n 和 k 可能非常大。我尝试通过如下使用模块化逆来做到这一点,但即使对于小数字也不会给出正确的输出。谁能告诉我哪里错了? import java.math.B
我正在尝试使用 java.math.BigInteger对于一些精确的整数矩阵计算,其中标量值达到数百万位。我注意到一些内置的 BigInteger 操作出乎意料地非常慢——特别是 gcd 的一些情况
我是一名优秀的程序员,十分优秀!