以下の内容はhttps://white-azalea.hatenablog.jp/entry/2019/01/05/140134より取得しました。


プログラマ脳を鍛える数学パズル 19

続きです。

これを 20 分とか言語によるでしょ…マジで。
ヒントで素数を作っておけば…みたいな事は書いていますが、そもそもこのジェネレータが存在するのか分からん…。

仕方ないので、作ったのが以下の prime_generator で、メモリの続く限りは素数を生成する。

きちんと追いかけると分かるが、取り出すたびに stream の中に is_individable のスタックが溜まっていくので、どこかでフローする。
あと、論理的には判定対象の数字 N を割って試す数は N/2 まででいいはずだが、この論理だと、過去出た全ての素数を判定するので、利用しやすさはまだしも無駄は多い。

import itertools
import functools


def prime_generator():
    stream = itertools.count(2)
    def is_individable(x, y): return x % y != 0

    while True:
        prime = next(stream)
        stream = filter(functools.partial(is_individable, y=prime), stream)
        yield prime


if __name__ == "__main__":
    prime_gen = prime_generator()
    prime_nums = [next(prime_gen) for _ in range(6)]
    min_value = prime_nums[-1] ** 2
    min_datas = []

    for prime in itertools.permutations(prime_nums):
        friends = []

        # Head/Tail
        head = prime[0]
        tail = prime[-1]

        # Calc head*head, head*(head+1)...(tail-1)*tail
        for n in prime:
            friends.append(head * n)
            head = n

        # tail
        friends = friends + [tail**2]

        # update current result
        if min_value > max(friends):
            min_value = max(friends)
            min_datas = friends

    print(f'Minimum: {min_value} at Datas: {min_datas}')



以上の内容はhttps://white-azalea.hatenablog.jp/entry/2019/01/05/140134より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14