2608 - Bi Prime
Cerinţa[edit | edit source]
Se dă n un număr natural care este produsul a două numere prime distincte, şi m reprezentând numărul numerelor mai mici sau egale cu n, prime cu n. Aflaţi cele două numere prime din descompunerea lui n.
Date de intrare[edit | edit source]
Programul citește de la tastatură numerele n şi m.
Date de ieşire[edit | edit source]
Programul va afișa pe ecran numerele prime din descompunerea lui n, în ordine crescătoare, separate prin spaţiu.
Restricții și precizări[edit | edit source]
- 1 ≤ m ≤ n ≤ 10*25
Exemplu[edit | edit source]
- Intrare
- 8777 8580
- Ieșire
- 67 131
Explicație[edit | edit source]
Avem 8777=67•131
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> import math
- functie pentru a calcula cel mai mare divizor comun
def cmmdc(a, b):
if b == 0: return a return cmmdc(b, a % b)
- functie pentru a determina un factor al lui n folosind metoda lui Pollard-Rho
def pollard_rho(n):
x = 2 y = 2 d = 1 while d == 1: x = (x * x + 1) % n y = (y * y + 1) % n y = (y * y + 1) % n d = cmmdc(abs(x - y), n) return d
- functie pentru a valida datele de intrare
def validare_date(n, m):
if n < 1 or m < 1 or n > 10**25 or m > n: return False return True
if __name__ == '__main__':
# citim numerele n si m de la tastatura n, m = map(int, input().split())
# validam datele de intrare if validare_date(n, m): # factorizam n folosind metoda lui Pollard-Rho factor1 = pollard_rho(n) factor2 = n // factor1
# calculam numarul de numere prime mai mici sau egale cu n, prime cu n phi = (factor1 - 1) * (factor2 - 1)
# afisam cei doi factori primi ai lui n in ordine crescatoare print(min(factor1, factor2), max(factor1, factor2)) else: print("Datele de intrare nu corespund restricțiilor impuse.")
</syntaxhighlight>