【问题标题】:Why did I get this [1, 2, 4, 8, 16, 1, 16, 8, 4, 2, 1]?为什么我得到这个 [1, 2, 4, 8, 16, 1, 16, 8, 4, 2, 1]?
【发布时间】:2011-03-30 16:07:43
【问题描述】:

经过反复试验,我找到了以下几行 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 和小波相关)。但是,我不太确定 为什么 它有效?我理解的最终模运算,它提供了系列中间的 1。第一个模运算中的因子 3 让我很头疼。任何人都可以提供解释吗?具体来说,我的基数 2 和因子 3 之间的关系是什么?

【问题讨论】:

  • 当我运行程序时,输出与您列出的不同。
  • 不是答案,但是,既然 Python 重视清晰度,为什么不直接使用 [2**n for n in range(N)] + [1] + [2**n for n in range(N-1, -1, -1)])
  • [0, 0, 0]不能是第一个结果,因为第一个N是2,这使得range()的参数在第二行2*2+1 = 5。因此,第一个列表应该有 5 个元素。
  • [0, 0, 0] 已被删除---早期代码的残余。
  • 不。输出仍然与您的源代码不匹配。 N 的范围是 2-16,所以应该有 14 个值。

标签: python algorithm language-agnostic math number-theory


【解决方案1】:

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

但要回答你的问题,这就是你得到这个结果的原因:

当 n

2n % (3*22N-n) = 2n,因为 2n2N-n。然后 2n % (2N-1) = 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 (mod 3),所以 4m=1m=1 (mod 3) 为好)。所以最终的结果是 2k = 22N-n,和预期的一样。

使用其他数字:

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

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

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

【讨论】:

  • 我自己和一位同事经历了你的推理,你是对的。感谢您提供非常清晰准确的答案。
【解决方案2】:

虽然我和下一个极客一样喜欢聪明的解决方案,但如果您在理解自己的代码时遇到困难,为什么不使用简单的解决方案呢?它会更容易维护,而且速度也不会很慢:

def fft_func(ex):
    if ex == 0:
        return [0, 0, 0]
    else:
        return [2**n for n in range(0, ex+1)] + [1] + [2**n for n in range(ex, -1, -1)]

【讨论】:

  • 最初,我不打算将此标记为 python 问题。是的,我同意,这个解决方案是 python 方式——如果你只关心编程。在其他语言中,我使用 python 来玩弄数学表达式以查看它们的行为方式。我的兴趣仍然是特定的表达方式,因为在我旁边是需要出现证明的笔和纸,而所述表达方式可能是其中的一部分。
【解决方案3】:

生成该列表的更简单方法:

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

【讨论】:

  • @lafrasu:是的,但我写的(函数f(k) = (N-abs(N-k))%N)充满了几何想象。
猜你喜欢
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多