def prime_count_AP(n, a, d): """ Returns the count of prime numbers less than or equal to n in AP defined by first term as 'a' and common difference 'd' Parameters ---------- n : int upper bound for prime numbers a : int first term of AP d : int common difference of AP return : int returns the count of prime numbers """ if (n != int(n) or a != int(a) or d != int(d)): raise ValueError("n , a and d are integers") if (if_infinite_prime_AP(a, d) == False): raise ValueError("a and d must be coprime") x = a count = 0 while (x <= n): if (isPrime(x) == True): count = count + 1 x = x + d return count
def generate_euclid_perfect(k): """ Return the perfect number generated from euclid's theorm If 2^k - 1 is prime, then (2^k)((2^k)-1) is perfect Parameters ---------- k : int denotes power of 2 in 2^k -1 return : int returns perfect number """ if (k != int(k) or k < 1): raise ValueError("k must be positive integer") n = int(math.pow(2, k) - 1) if (isPrime(n) == False): raise ValueError("invalid k") return int((math.pow(2, k - 1)) * (math.pow(2, k) - 1))
def quadratic_residues(p): """ Returns an array of quadratic residues mod p for a given prime p Parameters ---------- p : int denotes a prime number return : array returns an array of quadratic residues """ if (p != int(p) or p < 1): raise ValueError("p must be positive integer") if (isPrime(p) == False): raise ValueError("p must be prime number") quadratic_residues_array = [] for i in range(1, int(p / 2) + 1): quadratic_residues_array.append((i * i) % p) quadratic_residues_array = sorted(quadratic_residues_array) return quadratic_residues_array
def jacobi_symbol(n, p): """ Returns jacobi symbol (1 or -1) for given integer n and given prime p Parameters ---------- n : int denotes positive integer p : int denotes a prime number return : int returns 1 or -1 """ if (n != int(n) or n < 1 or p != int(p) or p < 1): raise ValueError("n and p must be positive integers") if (isPrime(p) == False): raise ValueError("p must be prime number") symbol = 1 for i in prime_factorization(p): symbol = symbol * (math.pow(legendre_euler_symbol(n, i), prime_factorization(p)[i])) return int(symbol)
def legendre_euler_symbol(n, p): """ Returns 1 if n is quadratic residue mod p else return -1 Parameters ---------- n : int denotes positive integer p : int denotes prime number return : int returns 1 if n is quadratic residue mod p else return -1 """ if (n != int(n) or n < 1 or p != int(p) or p < 1): raise ValueError("n and p must be positive integers") if (isPrime(p) == False): raise ValueError("p must be prime") r = (math.pow(n, (p - 1) // 2)) % p r = int(r) if (r == 1): return r else: return -1
def test_isPrime2(): assert isPrime(727) == True
def test_isPrime1(): assert isPrime(20) == False