プログラムは、整数yの少なくとも1つの因数を出力します。または、因数がない場合(それ自体と1以外)、yが素数であることを出力します。
変数xを使用して、1より大きいすべての可能な因子を試します。yの半分よりも大きい数は要因になり得ないため、yのフロアを2で割ったところから始まります。yが奇数の場合、フロア分割ではなく通常の分割を使用すると、小数値が得られる可能性があります。(さらに良い解決策は、yの平方根から始めることです。yが素数でない場合、その因子の1つはその平方根以下になります。)
ループ内では、yをxで割った後の余りであるy%xをテストします。余りがゼロの場合、それはxがyの因数であることを意味し、それを出力します。
else節は、因子が見つからない限り、ループの最後で実行されます。因子が見つからない場合、「break」はループとelse節をスキップします。したがって、要因が見つかるか、それが素数です。
インデントが修正された改善されたコードは次のとおりです。
import math
def check_primality(y):
x = int(math.sqrt(y))
while x > 1:
if y % x == 0:
print y, 'has factor', x
break
x -= 1
else:
print y, 'is prime'