【问题标题】:Understanding the wikipedia entry on Dragon Curves了解有关 Dragon Curves 的维基百科条目
【发布时间】:2008-12-29 19:35:04
【问题描述】:

我在玩 Project Euler 的 Problem 220,我对 Wikipedia 关于该主题的文章 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
  • 除了检查 2 的连续幂的可分性之外,是否有一种聪明的方法可以确定 n 是否可以表示为 k2^m?
  • 如果 n 不能以这种方式表示,这意味着什么?

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

【问题讨论】:

    标签: fractals


    【解决方案1】:

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

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

    【讨论】:

    • 二分搜索会加快速度吗?比 shift、anding 和 branching 更快?
    • 您可以组织对最低有效位的测试并一次移动一位,或者您可以先对低半位进行测试,然后再进行四分之一,依此类推,这在现代机器上更快。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多