为什么 Biginteger return 非素数以及为什么位数少

Why Biginteger return non prime number and why less bits

我有点困惑。我正在尝试用 BigInteger 做一个简单的数学方程式,但没有成功。我有 3 个 256 位素数,我测试如下。我的问题是,当我计算 (a^b mod p) 时,我得到了一个非素数,有时我还得到了一个 256 或 255 位的 BigInteger。为什么会发生这种情况,我该如何避免?

Random r = new Random();

byte[] random = new byte[32];
r.nextBytes(random);
randomServerPrimeNumber = BigInteger.probablePrime(256, r);
//System.out.println(randomServerPrimeNumber.isProbablePrime(1));
//System.out.println(value.isProbablePrime(0));
//System.out.println(randomServerPrimeNumber.bitLength());

BigInteger exponent = new BigInteger(Properties.exponent);
BigInteger mod = new BigInteger(Properties.modulus);
BigInteger result = exponent.modPow(randomServerPrimeNumber, mod);

System.out.println(exponent.isProbablePrime(1));//true
System.out.println(randomServerPrimeNumber.isProbablePrime(1));//true
System.out.println(mod.isProbablePrime(1));//true
System.out.println("");

System.out.println(exponent.bitLength());//256
System.out.println(randomServerPrimeNumber.bitLength());//256
System.out.println(mod.bitLength());//256

System.out.println("");
System.out.println(result.isProbablePrime(1));//false all time
System.out.println(result.bitLength());//sometime 256,255,242

我认为您不小心切换了 exponent.modPow(randomServerPriemNumber, mod) 中的参数。 a.modPow(b, c) 的计算结果为 a^b mod c,而不是 b^a mod c,但这不会对结果产生太大影响,因为所有三个数字都是 256 位长度的素数。至于结果的不同位长度,由于 BigInteger 的大长度是您需要表示它的绝对最小位数,因此它因不同的值而不同,即使它们是 modulo 相同的数字。

举个例子“10 mod 10”和“7 mod 10”。第一个计算为 0,位长为 0。第二个计算为 7,位长为 3。

至于a^b mod c到底该不该为质数,请见谅,我不知道应该是一个还是另一个。我对质数一无所知,所以其他人必须对此发表评论。