【问题标题】:How can I calculate 2^n+2^n-1+...+2^k mod 2^60 in C++, where the value of 2^i can be very big? [closed]如何在 C++ 中计算 2^n+2^n-1+...+2^k mod 2^60,其中 2^i 的值可能非常大? [关闭]
【发布时间】:2021-01-19 10:09:37
【问题描述】:

对于编程问题,我必须打印表达式2^n+2^n-1+...+2^k mod 2^60,其中1<=k<n<=240

基本上,我如何计算 2^240 mod 2^60?如果能解决这个问题,我也可以让它对 n

我在这里读到了一个答案: How can I calculate 2^n for large n?

但是,这会计算 n 而不是 2^n 的大值。

有什么帮助吗?

【问题讨论】:

  • 2^240 mod 2^60 = 0
  • 这对你有帮助吗:en.wikipedia.org/wiki/Modular_exponentiation?基本上:1. 无论如何你都可以分别做每个求和,2. (a*b) mod m = (a mod m)*(b mod m) mod m
  • @Aziuth 我不认为这在这种情况下很有用
  • 2^n 只是 1 后跟 n 个零。你可以把它当作一个字符串来做。
  • 所有 > 60 的幂都变成 0 mod 2^60,所以你可以忽略它们。其他的可以通过 64 位 int 中的左移来计算。简单。可能你所要求的并不是你真正想要的。

标签: c++ algorithm performance exponent exponentiation


【解决方案1】:
2^k + 2^k+1 + ... + 2^n-1 + 2^n mod 2^60

=

2^k * (2^0 + 2^1 + ... + 2^n-k-1 + 2^n-k) mod 2^60

=

2^k * ((2^n-k+1)-1) mod 2^60

=

(2^n+1 - 2^k) mod 2^60

=

(2^n+1 mod 2^60 - 2^k mod 2^60) mod 2^60
  • k >= 60: 结果为 0,因为 2^n+1 和 2^k 都可以除以 2^60
  • k
  • n >= 59: 结果为 -2^k
  • n

由于这些条件,所有这些数字都可以计算出来,因为它适合长变量(64 位)。

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2010-12-02
    • 2022-11-13
    • 2011-01-29
    • 2019-08-29
    相关资源
    最近更新 更多