#Primzahlurteil
def isPrime(n: int):
# validation chech
if n < 0:
raise("[ERROR] parameter must be not less than 0 (n >= 0)")
if n == 0 or n == 1:
return False
for i in range(2, n + 1):
#Schauen Sie unten √N. ich*Ich vergleiche es wie ich, weil ich nicht mit Brüchen umgehen will.
if i * i > n:
return True
if n % i == 0:
return False
#Primzahlurteil
N = 7
print(isPrime(N))
# True
zB) Wenn "i = 5", "5 * 2", "5 * 3" und "5 * 4" alle als Vielfache von 2, Vielfache von 3 und Vielfache von 2 fallen gelassen werden.
#Eratostenes Sieb
#Aufzählung der Primzahlen(Abschnitt kann angegeben werden)
def getPrimes(last: int, first: int = 1):
# validation check
if not isinstance(last, int) or \
not isinstance(first, int):
raise("[ERROR] parameter must be integer")
if last < 0 or first < 0:
raise("[ERROR] parameter must be not less than 0 (first >= 0 & last >= 0)")
if last < first:
last, first = first, last
isPrime = [True] * (last + 1) #Ob es eine Primzahl ist
#0 und 1 bis Falsch
isPrime[0] = isPrime[1] = False
for i in range(2, int(last ** 0.5 + 1)):
if isPrime[i]:
#Sieben. Setzen Sie alle Vielfachen von i auf False. Zu dieser Zeit i^Sie müssen nicht bis zu 2 sehen, da diese bereits herausgefiltert wurden
for j in range(i ** 2, last + 1, i):
isPrime[j] = False
return [i for i in range(first, last + 1) if isPrime[i]]
#Aufzählung der Primzahlen
N = 10 #Einschließlich der letzten Nummer
print(getPrimes(N))
# [2, 3, 5, 7]
#Aufzählung der Primzahlen
F = 13
L = 23 #Einschließlich der letzten Nummer
print(getPrimes(F, L))
# [13, 17, 19, 23]
#Anzahl der Primzahlen
N = 10 ** 7
print(len(getPrimes(N)))
# 664579
# 2.Über 5s
Code zum Aufzählen von Brüchen mit hoher Geschwindigkeit (Python) Es kommt sortiert heraus.
#Zahlen aufzählen
def getDivisors(n: int):
# validation check
if not isinstance(n, int):
raise("[ERROR] parameter must be integer")
if n < 0:
raise("[ERROR] parameter must be not less than 0 (n >= 0)")
lowerDivisors, upperDivisors = [], []
i = 1
while i * i <= n:
if n % i == 0:
lowerDivisors.append(i)
if i != n // i:
upperDivisors.append(n//i)
i += 1
return lowerDivisors + upperDivisors[::-1]
#Zahlen aufzählen
N = 120
print(getDivisors(N))
# [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60, 120]
#Holen Sie sich die Nummer von ungefähr
def getNumsOfDivisorsOfEachNumbers(n: int):
# validation check
if not isinstance(n, int):
raise("[ERROR] parameter must be integer")
if n < 0:
raise("[ERROR] parameter must be not less than 0 (n >= 0)")
nums = [0] * (n + 1) # 0-indexed
for i in range(1, n + 1):
for j in range(i, n + 1, i):
nums[j] += 1
nums.pop(0)
return nums
#Holen Sie sich die Nummer von ungefähr
N = 10
print(getNumsOfDivisorsOfEachNumbers(N))
Referenz) ABC172 D Problem von AtCoder
zB) Zum Beispiel, wenn 10 in Primfaktoren einbezogen werden.
import time
#Primfaktorisierung
def primeFactrization(n: int):
# validation check
if not isinstance(n, int):
raise("[ERROR] parameter must be integer")
if n < 0:
raise("[ERROR] parameter must be not less than 0 (n >= 0)")
dividableMinimunPrime = [i for i in range(0, n + 1)] #Die kleinste Primzahl, die die Zahl i teilt
for i in range(2, int(n ** 0.5 + 1)):
if dividableMinimunPrime[i] == i:
for j in range(i ** 2, n + 1, i):
if dividableMinimunPrime[j] == j: #Wenn Sie die Bedingung löschen und das Überschreiben zulassen, werden die erhaltenen Primfaktoren in absteigender Reihenfolge angezeigt.
dividableMinimunPrime[j] = i
#Gehen Sie genauso vor wie beim Verdoppeln
primeFactors = []
rest = n
while dividableMinimunPrime[rest] != rest:
primeFactors.append(dividableMinimunPrime[rest])
rest //= dividableMinimunPrime[rest]
primeFactors.append(rest)
return primeFactors
N = 200000
start = time.time()
print(primeFactrization(N))
elapsedTime = time.time() - start
print("time: {} [sec]".format(elapsedTime))
# [2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5]
# time: 0.05865812301635742 [sec]
# time: 0.07313990592956543 [sec]
# time: 0.05380010604858399 [sec]
Referenz) AtCoder ABC152 E Problem
Recommended Posts