我有一个很大的 512 位数 n,我需要将 n-1 重写为 m*2k 这是我写的代码: # 写入 (n-1) = m*2^k(其中 m 为奇数)
k = 0 # number of times we were able to divide by 2
total = (n-1)
while total % 2 == 0:
total /= 2
k += 1
m = int(total)
assert (n-1) == (2**k) * m # this does not hold true for large values of n for some reason
问题是它不适用于 n 的大值(515 位),例如: 871159945406388921782173885460195483437365004709624340762495475804157815638121598376571939076752706526773113110248444755593621508 17487924709
对于上面的n值,我的代码发现k=460,m=2926172291557515
当我在 python 中评估 2926172291557515 * 2**460 时,我得到: 871159945406388988940192305566962631664707089434598271509772046093636647706453926627976745121379172969655935717029240456622616869 87369584640
不等于 n-1。有谁知道为什么会这样?我认为这与拥有如此大的数字有关(此代码适用于我测试过的较小数字。
请您参考如下方法:
出现问题是因为您使用的是浮点除法的/=。将其替换为 //= 或整数除法,您的代码将起作用。
