在python中迭代自己的Diophantine方程

时间:2013-05-03 04:10:43

标签: python list diophantine

我自学MIT Open Courseware Introduction to Computer Science and ProgrammingProblem Set 2涉及基于计算鸡块盒总数(6,9或20)的丢番图方程。

我想要创建一个算法的方法就像创建一个虚拟测量棒(就像在木材店中一样),其中测量值(值)在棒上记录,然后转移到另一块。

如果我想象它被用在一个数字线上,它会指出初始值,我会标记这些点,然后,我将零点移动到它遇到的第一个标记并制作新的标记,并重复,总是前进。

所以,采用以下公式:x=0a=x+6b=x+9c=x+20,每个都附加到列表中,现在看起来像这样:{ {1}}。我当时想要做的是让[6,9,20]切换到列表中的下一个最大值,为其他变量创建新值,这些变量也会附加到列表中。 x的下一个值为x,更改其他变量并生成如下所示的列表:6。然后,[6,9,20,12,15,26],等等。

我的第一个问题是重复和列表的顺序导致无限循环。我通过添加一行创建了一组再次返回列表的列表来更正了这一点。这主要起作用。

但是,这就是问题所在,它并没有填充所有可能的值。例如,它没有将48列入列表,这是6的明显倍数。

我的猜测是,我的问题与我在不断编辑和/或追加的列表上进行迭代这一事实有关。

我知道有些算法我可以使用重新设计作业,因为我做了研究,甚至看到其他人如何编码这个问题的答案,我现在明白了,但我仍然想修复我的自己编写问题解决方案的方法。到目前为止,这是我的代码:

9

1 个答案:

答案 0 :(得分:1)

修改你正在迭代的同一个集合几乎总是不是一个好主意,因为迭代期望底层集合不被修改。特别是,在修改它时迭代Python中的列表似乎有......古怪的结果。尝试更改它以显式索引列表并改为增加索引,如下所示:

## Create a list to catch values, aka fish
fish = [0]
## Here goes
x, i = 0, 0
while x <= 60 and i < len(fish):
        x = fish[i]
        a, b, c = x+6, x+9, x+20
        ## catch the values into the list
        fish.append(a)
        fish.append(b)
        fish.append(c)
        ## get rid of duplicate numbers in the list.
        fish = sorted(set(fish))
        i = i + 1

作为参考,这是我如何解决它。我们想要添加到集合中的数字是那些可以表示为6的倍数+ 9的倍数+ 20的倍数。所以让我们迭代所有这些,然后从我们的集合中创建一个列表所有小于或等于max的元素:

def solvechickenboxes(max, x, y, z):

    sums = set()

    for a in range((max/x)+1):
        for b in range((max/y)+1):
            for c in range ((max/z)+1):
                sums.add(a*x + b*y + c*z)

    return [x for x in sums if x <= max]

solvechickenboxes(50, 6, 9, 20)

[0, 6, 9, 12, 15, 18, 20, 21, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 40, 41
, 42, 44, 45, 46, 47, 48, 49, 50]