经过反复试验,我发现了以下几行python代码,

for N in range(2**1,2**3):
    print [(2**n % (3*2**(2*N - n))) % (2**N-1) for n in range(2*N+1)]

产生以下输出,
[1, 2, 1, 2, 1]
[1, 2, 4, 1, 4, 2, 1]
[1, 2, 4, 8, 1, 8, 4, 2, 1]
[1, 2, 4, 8, 16, 1, 16, 8, 4, 2, 1]
[1, 2, 4, 8, 16, 32, 1, 32, 16, 8, 4, 2, 1]
[1, 2, 4, 8, 16, 32, 64, 1, 64, 32, 16, 8, 4, 2, 1]

即2的幂直到2**(N-1),1,2的幂​​颠倒了。这正是我需要解决的问题(与fft和wavelet相关)。但是,我不确定它为什么起作用?我了解最终的模运算,它在系列的中间提供了1。第一次模运算的因数3使我头疼。谁能提供解释?具体来说,我的底数2和因子3之间是什么关系?

最佳答案

首先,正如其他人所说的,可能有许多更简单的实现,您可能应该使用这些实现。

但是要回答您的问题,这就是为什么您得到此结果的原因:

当n

2n%(3 * 22N-n)= 2n,因为2n
当n = N 时:

2N%(3 * 22N-N)= 2N,2N%(2N-1)= 1。

当N

令n = 2N-k。然后:

2n%(3 * 22N-n)= 22N-k%(3 * 2k)= 2k *(22N-2k%3)= 2k *(4N-k%3)

4的任何幂等于1模3(因为4 = 1(模3),所以4m = 1m = 1(模3))。因此,最终结果是2k = 22N-n,正如预期的那样。

使用其他数字:

如果您使用基数a而不是2,并使用数字b而不是3,则最后一部分将为您提供:

ak *(((a2)N-k%b)

因此,您需要选择b作为a2-1的任意因子,这将确保对于任何k((a2)N-k%b)= 1。

关于python - 我为什么得到这个[1、2、4、8、16、1、16、8、4、2、1]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5488959/

10-12 19:38