123 lines
2.3 KiB
Python

#!/usr/bin/python3
from math import sqrt, floor, gcd
from numpy import ndarray, zeros
def is_prime(num):
if num < 4:
return num == 2 or num == 3
if num % 2 == 0 or num % 3 == 0:
return False
limit = floor(sqrt(num)) + 1
for i in range(5, limit, 6):
if num % i == 0 or num % (i + 2) == 0:
return False
return True
def is_palindrome(num, base):
reverse = 0
tmp = num
while tmp > 0:
reverse = reverse * base
reverse = reverse + tmp % base
tmp = tmp // base
if num == reverse:
return True
return False
def lcm(a, b):
return a * b // gcd(a, b)
def lcmm(values, n):
if n == 2:
return lcm(values[0], values[1])
value = values[0]
for i in range(1, n):
return lcm(value, lcmm(values[i:], n-1))
def sieve(n):
primes = ndarray((n,), int)
primes[0] = 0
primes[1] = 0
primes[2] = 1
primes[3] = 1
for i in range(4, n -1, 2):
primes[i] = 0
primes[i+1] = 1
limit = floor(sqrt(n))
for i in range(3, limit, 2):
if primes[i] == 1:
for j in range(i * i, n, 2 * i):
primes[j] = 0
return primes
def count_divisors(n):
count = 0
limit = floor(sqrt(n))
for i in range(1, limit):
if n % i == 0:
count = count + 2
if n == limit * limit:
count = count - 1
return count
def find_max_path(triang, n):
for i in range(n-2, -1, -1):
for j in range(0, i+1):
if triang[i+1][j] > triang[i+1][j+1]:
triang[i][j] = triang[i][j] + triang[i+1][j]
else:
triang[i][j] = triang[i][j] + triang[i+1][j+1]
return triang[0][0]
def is_pandigital(value, n):
i = 0
digits = zeros(n + 1, int)
while i < n and value > 0:
digit = value % 10
if digit > n:
return False
digits[digit] = digits[digit] + 1
value = value // 10
i = i + 1
if i < n or value > 0:
return False
if digits[0] != 0:
return False
for i in range(1, n+1):
if digits[i] != 1:
return False
i = i + 1
return True
def is_pentagonal(n):
i = (sqrt(24*n+1) + 1) / 6
return i.is_integer()