Pythonでは,薬水または小数,およびアラクレマイシンのふるいを判別した.


判別基本アルゴリズム


に水を飲ませる

def check_divisor(nums):
	divisors = []
	for i in range(1, nums+1):
    	if nums % i == 0:
        	divisors.append(i)
    return divisors

少数


1とそれ自体以外の自然数は不可分であり、1より大きい自然数である.
  • 4は1、2、4があり、少数ではありません.
  • 7は約1万と7万で、少数です.
  • 素数判別基本アルゴリズム

    def check_prime_number(nums):
    	for i in range(2,nums):
        # 2 이상의 자연수인 nums에 대해 반복문을 돌며 nums-1까지 일일히 확인해
        	if i % nums == 0:
            	return False
            # i가 nums와 나누어 떨어지면 nums는 소수가 아님
        return True

    薬性

    nが自然数であると仮定すると、a * b = nを満たす自然数aおよびbが存在する.また、n = m * mmがいれば、a * b = m * mが成立する.この状態で、abが自然数であれば、以下の3つのケースのいずれかである必要がある.
  • a = m, b = m. 즉 a = b
  • a > m, b < m
  • a < m, b < m
  • abは自然水のために、常に以上の3つの例のうちの1つであり、min(a,b) <= mであるべきである.すなわち、aおよびbの小数字は、m、すなわちnの平方根以下である.
    この原理により,全numsの範囲を確認する必要はなく,numsの平方根を確認すれば,薬水を見つけたり少数の判別を行うことができる.

    約数の性質を利用してアルゴリズムを最適化する


    に水を飲ませる

    def check_divisor(nums):
        divisors = []
        for i in range(1, int(nums**0.5) + 1):
            if nums % i == 0:
                divisors.append(i)
                if i != int(nums/i):
                    divisors.append(int(nums/i))
        return sorted(divisors)

    少数

    def check_prime(num):
        if num == 1: return False # 1은 소수가 아니므로 제외
        
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                return False
    
        return True

    エラトステネスのふるい


    素数を判別する多様なアルゴリズムの中で,任意の自然数n以下の特定の範囲で素数を探すことが最も速く最も簡単な方法である.
    例を挙げると,120以下の自然数の中で少数を探す.
    原理は以下の通り.
  • まず、少数でも合成数でもない唯一の自然数1が少数でもないので、それを除去する.
  • 次の数字2も小数なので小数としてチェックし、配列から2の倍数を抜きます.
  • 次の数字を確認し、前のステップから削除しない場合は小数で確認し、その数字の倍数を削除します.120の平方根までこの手順を繰り返します.
  • 実装を試みる

    def prime_number(num):
        # 0부터 num 범위의 자연수의 소수 판별 여부를 위한 리스트. 
        # 0과 1은 소수가 아니므로 False로 선언
        check_prime = [False, False] + [True] * (num - 1)
    
        # 앞서 설명한 약수의 원리를 응용해 소수 판별 범위 축소
        for i in range(2, int(num**0.5)+1):
            if check_prime[i]:
                # i가 소수라면 i 이후 나올 i의 배수들은 전부 소수가 아니므로 False 선언
                for j in range(i+i, num+1, i):
                    check_prime[j] = False
    
        return [i for i in range(2, num+1) if check_prime[i]]
        
    print(prime_numbers(131))
    >> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 
    61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131]

    reference


    [これが符号化テストwith Python]37強素数判別アルゴリズム-Youtube
    [これが符号化テストwith Python]37強素数判別アルゴリズム
    [C++]最良の少数を探して、エラトスのふるい
    [私が見たいPython]少数判別(エラトスのふるい)
    小数判別アルゴリズム—Python(Python)
    エラトニスのふるい