了解Dragon Curves上的维基百科条目

时间:2008-12-29 19:35:04

标签: fractals

我正在玩Project Euler的Problem 220,我对有关该主题的维基百科文章Dragon Curve感到有些困惑。关于计算第n转的方向而不必绘制整个曲线的主题,它说:

  

首先,以k * 2 ^ m的形式表示n,其中k是奇数。第n圈的方向由k mod 4确定,即当k除以4时剩余的余数。如果k mod 4为1,则第n圈为R;如果k mod 4为3,则第n个转弯为L.

     

例如,要确定转弯方向76376:

76376 = 9547 x 8.
9547 = 2386x4 + 3
so 9547 mod 4 = 3
so turn 76376 is L
  • 是否有一种聪明的方法可以确定n 是否可以表示为k2 ^ m,除了通过2的连续幂检查可分性?
  • 如果n不能以这种方式表达,这意味着什么?

(问题涉及计算长度为2 ^ 50的Dragon曲线上某点的位置,因此实际绘制曲线是不可能的。)

2 个答案:

答案 0 :(得分:3)

m是数字最低端的零位数。 只要数字是偶数,最简单的算法就是除以2, 但你也可以使用二进制搜索加快速度。

所有整数都可以用这种方式表示。

答案 1 :(得分:1)

任何整数都可以表示为k * 2 ^ m,其中k是奇数。要查看原因,请用二进制编写任意数字。从右边(最低有效位)开始,将会有一个全零的字符串。它可能是一个空字符串。零的数量是m。其余的比特组成k。 k的最低有效位是一个(因为如果它是零,你只需要扩展你的零串),所以k是奇数。

要找到k和m,你可能会写一个简单的循环(在本例中是Python):

def k_and_m(n):
    k, m = n, 0
    while (k % 2) == 0:
        k >>= 1
        m += 1
    return k, m