首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更快地计算(x**2-2)%

如何更快地计算(x**2-2)%
EN

Stack Overflow用户
提问于 2018-12-11 13:15:03
回答 5查看 401关注 0票数 1
代码语言:javascript
运行
复制
x = 2**1000000
n = 2**100000000

(x**2-2)%n太慢了。我找到了pow(),但是我不能使用它,因为我不能减去2。(pow(x, 2)-2)%n(x*x-2)%n也很慢。当我测试(x*x-2)时,它是快速的,但是当我添加模块化操作符时,它是缓慢的。有更快计算(x**2-2)%n的方法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-12-11 13:32:15

你在解释器里运行这个吗?我做了一些测试,主要的放缓似乎来自于试图显示结果的解释器。

如果将表达式赋值给变量,解释器将不会尝试显示结果,它将非常快:

代码语言:javascript
运行
复制
x = 2**1000000
n = 2**100000000
result = (x**2-2)%n

增编:

我最初也是按照MikeW的答案思考的,如果您希望代码的每个部分都是快速的,您可以利用Python对整数的内部基2表示,并使用按位左移的方法:

代码语言:javascript
运行
复制
x = 1 << 1000000
n = 1 << 100000000

这附带了一个警告,即这只是因为xn是2的幂,所以您必须更加小心,避免犯一个错误。这个答案很好地解释了位移位是如何工作的,但是Python与其他语言(如C、C++或Java )略有不同,因为Python整数是无限精度,所以您永远不能像在其他语言中那样完全离开shift。

票数 9
EN

Stack Overflow用户

发布于 2018-12-11 13:29:57

如果x总是2的幂,n总是2的幂,那么您可以使用字节数组上的位操作来轻松、快速地计算它,然后可以将其重构为一个“数字”。

如果2^N是(二进制)1后面是N零,那么(2^N)^2是(二进制)1,后面是2N零。

代码语言:javascript
运行
复制
2^3 squared is b'1000000'

如果你有一个数字2^K (二进制1后面跟着K 0),那么2^K-2将是K-1 (1)后面是零。

代码语言:javascript
运行
复制
eg 2^4 is 16 =  b'10000', 2^4 - 2 is b'1110'

如果您需要"% 2^M“,那么在二进制文件中,只需选择最后(较低的)M位,而忽略其余的。

代码语言:javascript
运行
复制
9999 is       b'10011100001111'
9999 % 2^8 is       b'00001111'

因此,如果x=2^A和n=2^B组合了各个部分,那么

(X^2-2)%n

将是:(最后B位)(二进制)(2*A-1 '1's后面跟着a '0')

票数 1
EN

Stack Overflow用户

发布于 2018-12-11 13:39:20

一些模块规则:

1) (a+b)mod(n) = amod(n)+bmod(N)

2) (a.b)mod(n) = amod(n).bmod(n)

所以你可以把你的方程转换成:

(x**2-2)%n ==> (x.x - 2)%n ==> (x%n)(X%n)- (2%n)

如果n总是大于2,则(2%n)等于2本身。

解(x%n):

如果x和n总是2**值;如果x>n,则(x%n)= 0,如果x

答案要么是0-(2%n),要么是x**2-(2%n)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53724955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档