-5

我需要(9173501 * 9173502 * 9173504) % 9173503用 C# 计算;result = 2 但 C# 无法计算它。如果您有任何想法,请帮助我。

4

4 回答 4

47

没有必要使用大整数。

使用这个公式:

(x * y) % k = ((x % k) * (y % k)) % k

这样,您可以将模数应用于两个数字的乘积,每个数字都是< 9173503,因此该乘积将适合long.

注意:加法也一样:

(x + y) % k = ((x % k) + (y % k)) % k

和减法,略有变化:

(x - y) % k = ((((x % k + k) % k) - ((y % k + k) % k)) % k + k) % k

但是,它不适用于除法:

(4 / 2) % 3 = 2
4 mod 3 = 1
2 mod 3 = 2
1 / 2 != 2
于 2013-09-26T18:32:46.827 回答
9

在开始计算之前将您的数字转换为 BigInteger:

Console.WriteLine((new BigInteger(9173501)*9173502*9173504)%9173503);
// Output: 2
于 2013-09-26T18:32:08.183 回答
5

没有 就不能直接计算它BigInteger,但在数学上它相当于:

((long)9173501 % 9173503) * (9173502 % 9173503) * (9173504 % 9173503)  % 9173503
于 2013-09-26T18:33:23.527 回答
1

这是一道数学题,不是编程题。

如您所见,这些数字彼此非常接近,因此代入n = 9173503您将得到:(n-2)(n-1)(n+1) % n.

打开括号,您将得到以下多项式:n^3 - 2*n^2 - n + 2余数n为:

  • 2 对于每 n > 2
  • 0 代表 n = 1, 2

这意味着不仅是(9173501 * 9173502 * 9173504) % 9173503 = 2,而且13^127^61 * (13^127^61 + 1) * (13^127^61 + 3) % (13^127^61 + 2)也是2,这很可能是用 C# 或其他编程语言无法计算的。

于 2014-01-13T20:55:56.263 回答