Merge pull request #395 from FarhanKasmani/ExtraAlgortihms

Extra Algorithms added
This commit is contained in:
Harshil
2018-10-03 21:55:55 +02:00
committed by GitHub
9 changed files with 431 additions and 0 deletions

70
Maths/BasicMaths.py Normal file
View File

@@ -0,0 +1,70 @@
import math
def primeFactors(n):
pf = []
while n % 2 == 0:
pf.append(2)
n = int(n / 2)
for i in range(3, int(math.sqrt(n))+1, 2):
while n % i == 0:
pf.append(i)
n = int(n / i)
if n > 2:
pf.append(n)
return pf
def numberOfDivisors(n):
div = 1
temp = 1
while n % 2 == 0:
temp += 1
n = int(n / 2)
div = div * (temp)
for i in range(3, int(math.sqrt(n))+1, 2):
temp = 1
while n % i == 0:
temp += 1
n = int(n / i)
div = div * (temp)
return div
def sumOfDivisors(n):
s = 1
temp = 1
while n % 2 == 0:
temp += 1
n = int(n / 2)
if temp > 1:
s *= (2**temp - 1) / (2 - 1)
for i in range(3, int(math.sqrt(n))+1, 2):
temp = 1
while n % i == 0:
temp += 1
n = int(n / i)
if temp > 1:
s *= (i**temp - 1) / (i - 1)
return s
def eulerPhi(n):
l = primeFactors(n)
l = set(l)
s = n
for x in l:
s *= (x - 1)/x
return s
print(primeFactors(100))
print(numberOfDivisors(100))
print(sumOfDivisors(100))
print(eulerPhi(100))

46
Maths/SegmentedSieve.py Normal file
View File

@@ -0,0 +1,46 @@
import math
def sieve(n):
in_prime = []
start = 2
end = int(math.sqrt(n)) # Size of every segment
temp = [True] * (end + 1)
prime = []
while(start <= end):
if temp[start] == True:
in_prime.append(start)
for i in range(start*start, end+1, start):
if temp[i] == True:
temp[i] = False
start += 1
prime += in_prime
low = end + 1
high = low + end - 1
if high > n:
high = n
while(low <= n):
temp = [True] * (high-low+1)
for each in in_prime:
t = math.floor(low / each) * each
if t < low:
t += each
for j in range(t, high+1, each):
temp[j - low] = False
for j in range(len(temp)):
if temp[j] == True:
prime.append(j+low)
low = high + 1
high = low + end - 1
if high > n:
high = n
return prime
print(sieve(10**6))

View File

@@ -0,0 +1,24 @@
import math
n = int(input("Enter n: "))
def sieve(n):
l = [True] * (n+1)
prime = []
start = 2
end = int(math.sqrt(n))
while(start <= end):
if l[start] == True:
prime.append(start)
for i in range(start*start, n+1, start):
if l[i] == True:
l[i] = False
start += 1
for j in range(end+1,n+1):
if l[j] == True:
prime.append(j)
return prime
print(sieve(n))