pythonのmathモジュールについて
pythonのnumpyモジュールとTkEasyGUIで最小公倍数と最大公約数を求めるコードをGUIの勉強で下記のように書いてみました。最小公倍数と最大公約数の他に公約数の列挙を加えたいと思いmathモジュールのコードに行き着つきました。もともとmathモジュールではarray部分の置換え方が上手く行かなかったのでnumpyで求めるようにしていたのですが、mathに切り替えて使えるようにしたいともいますので方法についてご教授宜しきお願いいたします。
#numpyモジュールとTkEasyGUIで最小公倍数と最大公約数を求める
import numpy as np
import TkEasyGUI as eg
# 画面レイアウトを定義
layout=[
[eg.Label('最小公倍数と最大公約数',color='red',font=("Meiryo",11,'bold'))],
[eg.Text("数値を入力してください。",font=("Meiryo",10))],
[eg.Input("", key="Input1"),eg.Input("", key="Input2"),eg.Input("", key="Input3"),eg.Input("", key="Input4")],
[eg.Button("最小公倍数",background_color="#fff001"),eg.Button("最大公約数"),eg.Button("クリア",pad=(30,5)),eg.Button("キャンセル",background_color="pink")],
[eg.Multiline("", key="result",font=("Meiryo",10),size=(40,2))],
]
# ウィンドウを表示
with eg.Window("test", layout) as window:
for event, values in window.event_iter():
if event == eg.WINDOW_CLOSED or event == "キャンセル":
break
if event == "最小公倍数" or event == "最大公約数":
if values["Input1"] == "" or values["Input2"] == "":
array = [0,0]
elif values["Input3"] == "" and values["Input4"] == "":
array= [int(values["Input1"]),int(values["Input2"])]
elif values["Input4"] == "" :
array= [int(values["Input1"]),int(values["Input2"]),int(values["Input3"])]
else:
array = [int(values["Input1"]),int(values["Input2"]),int(values["Input3"]),int(values["Input4"])]
if event == "最小公倍数":
lcd = np.lcm.reduce(array)
window["result"].update(f"最小公倍数は:{lcd}です。")
elif event == "最大公約数":
max = np.gcd.reduce(array)
window["result"].update(f"最大公約数は:{max}です。")
if event == "クリア":
window["Input1"].update("")
window["Input2"].update("")
window["Input3"].update("")
window["Input4"].update("")
window["result"].update("")
window.close()
#公約数の列挙
def divisors(n):
lower_divisors, upper_divisors = [], []
i = 1
while i * i <= n:
if n % i == 0:
lower_divisors.append(i)
if i != n // i:
upper_divisors.append(n // i)
i += 1
return lower_divisors + upper_divisors[::-1]
import math
print(divisors(math.gcd(330, 726, 1155, 957)))
お礼
とてもわかり安かったです。 ありがとうございました。