求模有快速算法吗?

STEM版,合并数学,物理,化学,科学,工程,机械。不包括生物、医学相关,和计算机相关内容。

版主: verdeliteTheMatrix

回复
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#1 求模有快速算法吗?

帖子 (ヅ)楼主 »

特殊的除数,所有二进制位全是1,比如mod 7, mod 15, mod 31这样

发现这个运算非常慢
FoxMe(令狐)
论坛精英
论坛精英
帖子互动: 156
帖子: 5573
注册时间: 2022年 7月 26日 16:46

#2 Re: 求模有快速算法吗?

帖子 FoxMe(令狐) »

如果是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呢?
han6(周瑜)
职业作家
职业作家
帖子互动: 20
帖子: 690
注册时间: 2022年 8月 2日 12:21

#3 Re: 求模有快速算法吗?

帖子 han6(周瑜) »

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呢?
一回事,可以把模設為負一。
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#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呢?
这个本质上还是做除法,没有减少运算量?
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#5 Re: 求模有快速算法吗?

帖子 (ヅ)楼主 »

我的代码如下,怎么提速比较好?

def foo():
n = 132049
div = 2 ** n - 1
s = 10
for i in range(n - 2):
s = (s ** 2 - 1) % div

foo()
Caravel
论坛元老
论坛元老
Caravel 的博客
帖子互动: 686
帖子: 27181
注册时间: 2022年 7月 24日 17:21

#6 Re: 求模有快速算法吗?

帖子 Caravel »

(ヅ) 写了: 2024年 6月 10日 14:10 特殊的除数,所有二进制位全是1,比如mod 7, mod 15, mod 31这样

发现这个运算非常慢
需要多快,这个现代计算机一次都是ns级别的吧,
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#7 Re: 求模有快速算法吗?

帖子 (ヅ)楼主 »

Caravel 写了: 2024年 6月 13日 00:41 需要多快,这个现代计算机一次都是ns级别的吧,
上面那个例子你跑一下啊

我这里慢的很
Caravel
论坛元老
论坛元老
Caravel 的博客
帖子互动: 686
帖子: 27181
注册时间: 2022年 7月 24日 17:21

#8 Re: 求模有快速算法吗?

帖子 Caravel »

(ヅ) 写了: 2024年 6月 13日 00:46 上面那个例子你跑一下啊

我这里慢的很
你为啥要取这么大数字的模?这取完不就等于自己么
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#9 Re: 求模有快速算法吗?

帖子 (ヅ)楼主 »

Caravel 写了: 2024年 6月 13日 01:33 你为啥要取这么大数字的模?这取完不就等于自己么
被除数也很大唉
FoxMe(令狐)
论坛精英
论坛精英
帖子互动: 156
帖子: 5573
注册时间: 2022年 7月 26日 16:46

#10 Re: 求模有快速算法吗?

帖子 FoxMe(令狐) »

哪里做除法了?
(ヅ) 写了: 2024年 6月 12日 23:41 这个本质上还是做除法,没有减少运算量?
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#11 Re: 求模有快速算法吗?

帖子 (ヅ)楼主 »

FoxMe 写了: 2024年 6月 14日 09:48 哪里做除法了?
说得有道理

我跑了例子,这样可以提速到4x
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#12 Re: 求模有快速算法吗?

帖子 (ヅ)楼主 »

foxme这个办法蛮好,n越大越快

原算法: n = 132049 2939.754820799979
改进后: n = 132049 341.1524356000009

快9倍了

还能提速?
头像
(ヅ)楼主
论坛支柱
论坛支柱
帖子互动: 549
帖子: 11819
注册时间: 2022年 8月 21日 14:20

#13 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呢?
b_{n-1} ... b_1 b_0
- b_{2n-1} ... b_{n+1} b_{n}
+ b_{3n-1} ... b_{2n+1} b_{2n}
-... mod 2^n + 1

其实最多就2n位
回复

回到 “STEM”