【发布时间】:2021-11-26 03:32:00
【问题描述】:
我想做一些事情来更好地了解产量和产量。目标是按顺序生成马尔可夫序列,第一个元素为索引 0。 https://en.wikipedia.org/wiki/Markov_number
我想出了以下代码。
def chain(iter1, iter2):
while True:
yield next(iter1)
yield next(iter2)
def isMarkov(x,y,z):
if x**2 + y**2 + z**2 == 3 * x * y * z:
return True
else:
return False
def gen_markov(seed):
x1 = seed[0]
y1 = seed[2]
z1 = y1 + 1
while not isMarkov(x1,y1,z1):
z1 += 1
yield (x1,y1,z1)
x2 = seed[1]
y2 = seed[2]
z2 = y2 + 1
while not isMarkov(x2,y2,z2):
z2 += 1
yield (x2,y2,z2)
yield from chain(gen_markov((x1,y1,z1)), gen_markov((x2,y2,z2)))
def markov(n):
g = gen_markov((1,2,5))
markov_nums = set([1,2,5])
while len(markov_nums) <= n:
triple = next(g)
for x in triple:
markov_nums.add(x)
markov_nums = list(markov_nums)
markov_nums.sort()
print(markov_nums[n])
n = int(input('Enter n: '))
markov(n)
这可以在树状结构中生成马尔可夫三元组。
这是 gen_markov 函数生成的前 35 个马尔科夫三元组。
(1, 5, 13)
(2, 5, 29)
(1, 13, 34)
(2, 29, 169)
(5, 13, 194)
(5, 29, 433)
(1, 34, 89)
(2, 169, 985)
(5, 194, 2897)
(5, 433, 6466)
(13, 34, 1325)
(29, 169, 14701)
(13, 194, 7561)
(29, 433, 37666)
(1, 89, 233)
(2, 985, 5741)
(5, 2897, 43261)
(5, 6466, 96557)
(13, 1325, 51641)
(29, 14701, 1278818)
(13, 7561, 294685)
(29, 37666, 3276509)
(34, 89, 9077)
(169, 985, 499393)
(194, 2897, 1686049)
(433, 6466, 8399329)
(34, 1325, 135137)
(169, 14701, 7453378)
(194, 7561, 4400489)
(433, 37666, 48928105)
(1, 233, 610)
(2, 5741, 33461)
(5, 43261, 646018)
(5, 96557, 1441889)
(13, 51641, 2012674)
我的问题是我希望能够按顺序生成序列。数字 610 是序列中的第 11 个元素,但远大于 610 的数字会更早生成。例如,如果您运行 n=11,则函数返回 2897。关于如何按顺序生成序列的任何建议?
【问题讨论】:
-
与链接中的顺序相同?
-
如果您想要与链接中相同的顺序,那么您对
gen_markov的实现就是问题所在。您的尝试确实是一种蛮力方法。我对此类数字没有经验,但在链接中提到了构造此类数字的明确方法。看看德语翻译,你会发现一些更有用的技巧(它更完整!)来生成它们
标签: python math generator sequence yield