经过反复试验,我发现了以下几行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/