【问题标题】:How to use a very long integer to compute a value in C++?如何使用非常长的整数来计算 C++ 中的值?
【发布时间】:2014-09-10 13:50:20
【问题描述】:

我需要计算(n*(2n+1)*(n+1)*(3(n^2)+3n+1))/30 modulo m,其中: - 30 & m 可以是非互质的 - n 的值最高可达 10^10(对于 long long int 来说太大了) - m 可以有任何值,最大为 10000

我试过这个:

long long int tp1;
double k;
k=n;
k=k*((2*n)+1);
k=k*(n+1);
k=k*((3*n*n)+(3*n)-1);
tp1=fmod(k/30,m);

【问题讨论】:

  • 使用能够容纳至少 10000^2 的所有整数的类型(例如,long long),并进行早期和急切的模减少以保持可接受的低值。 (10^10)^5 远远超过 2^64。 (我用 ^ 来表示功率,而不是 C 运算符按位异或)。 (% 是 C 中的整数余数运算符,了解余数和取模的区别)
  • 旁白(也是@Fr):如果可以避免的话,不要尝试用浮点数进行精确的整数计算。这里完全没有必要。
  • 提示:(x * y) mod m == ((x mod m) * (y mod m)) mod m.
  • @molbdnilo 但是我如何处理(x/y) % m 我已经尝试过(x % m / y^-1 ) % m 但仍然没有用
  • @molbdnilo 但假设我的 x 是 10040,m 是 100,y 是 30,所以 10040 % 100 = 4040 / 30 = 110040/30 = 335335 % 100 = 35

标签: c++ modulo


【解决方案1】:

As noted by molbdnilo,你可以做所有模数的计算。

扩展这个想法:

  • (x * y) mod m((x mod m) * (y mod m)) mod m 相同
  • (x + y) mod m((x mod m) + (y mod m)) mod m 相同

然而

  • (x / y) mod m((x mod m) / (y mod m)) mod m 不一样

因此,您必须计算 n*(2n+1)*(n+1)*(3(n^2)+3n+1) mod (30 * m),然后将其除以 30。

附:我假设除法运算的含义与 c++ 中的相同,“四舍五入除法”。

【讨论】:

  • 先生,我们这里有 b & m non com-prime,所以我会为此工作吗?
【解决方案2】:

对于非常长的整数,请使用 Gnu 项目中的 GMP。 GMP

使用 c++ 变体 (gmpxx),您只需像这样声明您的号码:

mpz_class number;

你可以像这样进行计算:

number = k*((3*n*n)+(3*n)-1);

其中 k 和 n 可以是 int 或 mpz_class(或许多其他类型)。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2020-05-24
    • 2010-10-23
    • 2018-08-31
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多