求模有快速算法吗?
版主: verdelite, TheMatrix
#2 Re: 求模有快速算法吗?
如果是mod 2^n - 1,把x写成二进制:
x = ... b_{2n-1} ... b_{n+1} b_{n} b_{n-1} ... b_1 b_0
x mod 2^n - 1
= b_{n-1} ... b_1 b_0
+ b_{2n-1} ... b_{n+1} b_{n}
+ ... mod 2^n - 1
应该很方便。我再出个题,如果是mod 2^n + 1呢?
x = ... b_{2n-1} ... b_{n+1} b_{n} b_{n-1} ... b_1 b_0
x mod 2^n - 1
= b_{n-1} ... b_1 b_0
+ b_{2n-1} ... b_{n+1} b_{n}
+ ... mod 2^n - 1
应该很方便。我再出个题,如果是mod 2^n + 1呢?
#3 Re: 求模有快速算法吗?
一回事,可以把模設為負一。FoxMe 写了: 2024年 6月 12日 17:21 如果是mod 2^n - 1,把x写成二进制:
x = ... b_{2n-1} ... b_{n+1} b_{n} b_{n-1} ... b_1 b_0
x mod 2^n - 1
= b_{n-1} ... b_1 b_0
+ b_{2n-1} ... b_{n+1} b_{n}
+ ... mod 2^n - 1
应该很方便。我再出个题,如果是mod 2^n + 1呢?
#4 Re: 求模有快速算法吗?
这个本质上还是做除法,没有减少运算量?FoxMe 写了: 2024年 6月 12日 17:21 如果是mod 2^n - 1,把x写成二进制:
x = ... b_{2n-1} ... b_{n+1} b_{n} b_{n-1} ... b_1 b_0
x mod 2^n - 1
= b_{n-1} ... b_1 b_0
+ b_{2n-1} ... b_{n+1} b_{n}
+ ... mod 2^n - 1
应该很方便。我再出个题,如果是mod 2^n + 1呢?
#5 Re: 求模有快速算法吗?
我的代码如下,怎么提速比较好?
def foo():
n = 132049
div = 2 ** n - 1
s = 10
for i in range(n - 2):
s = (s ** 2 - 1) % div
foo()
def foo():
n = 132049
div = 2 ** n - 1
s = 10
for i in range(n - 2):
s = (s ** 2 - 1) % div
foo()
-
- 论坛元老
Caravel 的博客 - 帖子互动: 685
- 帖子: 27165
- 注册时间: 2022年 7月 24日 17:21
-
- 论坛元老
Caravel 的博客 - 帖子互动: 685
- 帖子: 27165
- 注册时间: 2022年 7月 24日 17:21
#12 Re: 求模有快速算法吗?
foxme这个办法蛮好,n越大越快
原算法: n = 132049 2939.754820799979
改进后: n = 132049 341.1524356000009
快9倍了
还能提速?
原算法: n = 132049 2939.754820799979
改进后: n = 132049 341.1524356000009
快9倍了
还能提速?
#13 Re: 求模有快速算法吗?
b_{n-1} ... b_1 b_0FoxMe 写了: 2024年 6月 12日 17:21 如果是mod 2^n - 1,把x写成二进制:
x = ... b_{2n-1} ... b_{n+1} b_{n} b_{n-1} ... b_1 b_0
x mod 2^n - 1
= b_{n-1} ... b_1 b_0
+ b_{2n-1} ... b_{n+1} b_{n}
+ ... mod 2^n - 1
应该很方便。我再出个题,如果是mod 2^n + 1呢?
- b_{2n-1} ... b_{n+1} b_{n}
+ b_{3n-1} ... b_{2n+1} b_{2n}
-... mod 2^n + 1
其实最多就2n位