mathslib package¶
Submodules¶
mathslib.numtheory module¶
Various Number Theory functions
Author: Igor van Loo
- mathslib.numtheory.divisors_of(x, include_x=True)[source]¶
Finds all the divisors of x
- Parameters:
x – Integer to be checked
include_x – Optional boolean value, If true it will include x as a divisor of x
- Returns:
A list which contains all divisors of x
print(divisors_of(15)) #[1, 3, 5, 15] print(divisors_of(15, include_x = False)) #[1, 3, 5]
- mathslib.numtheory.divisor(x, n)[source]¶
Implementation of Divisor function sigma(x, n)
- Parameters:
x – An integer, denotes the power till which the divisors will be summed
n – An integer, denotes the number to find the divisors of
- Returns:
An integer
print(divisor(0, 9)) #3 print(divisor(1, 9)) #13 print(divisor(2, 9)) #91
- mathslib.numtheory.continued_fraction(x)[source]¶
Finds the continued Fraction of the sqrt(x)
- Parameters:
x – An integer
- Returns:
A list containing the continued fraction of x
print(continued_fraction(19)) #[4, 2, 1, 3, 1, 2, 8]
Note
The continued fraction may repeat forever, the code stops once it repeats, otherwise once we find the 100th number in the continued fraction
- mathslib.numtheory.overall_fraction(cf)[source]¶
- Parameters:
cf – A list, this list represents the continued fraction of a number
- Returns numerator:
An integer, the numerator of the fraction
- Returns denominator:
An integer, the denominator of the fraction
print(overall_fraction([4, 2, 6, 7])) #(415, 93)
- mathslib.numtheory.phi(n)[source]¶
Implementation of Eulers Totient Function counts the positive integers up to a given integer n that are relatively prime to n
- Parameters:
n – An integer
- Returns:
An integer, numbers, a, less than n, such that gcd(a, n) = 1
print(phi(20)) #8 print(phi(100)) #40
- mathslib.numtheory.phi_sieve(n)[source]¶
A sieve for Eulers Totient Function which counts the positive integers up to a given integer n that are relatively prime to n
- Parameters:
n – An integer
- Returns:
An array, where array[x] = phi(x)
print(phi_sieve(10)) #[0, 1, 1, 2, 2, 4, 2, 6, 4, 6, 4] print(phi_sieve(20)[11:]) #[10, 4, 12, 6, 8, 8, 16, 6, 18, 8]
- mathslib.numtheory.phi_sum(n)[source]¶
Computes the Totient Summatory Function
The algorithm is based on Overview of Project Euler Problem 351 specifically, this is an implementation of Algorithm 6, which you may view after Solving Problem 351
- Parameters:
n – An integer
- Returns:
sum of phi(x) where x goes from 1 to n
print(phi_sum(10**4)) #30397486 print(sum(phi(i) for i in range(1, 10**4 + 1))) #30397486 print(sum(phi_sieve(10**4))) #30397486
- mathslib.numtheory.mobius(n)[source]¶
Implementation of the Mobius function of n
- Parameters:
n – An integer
- Returns:
An integer
print(Mobius(10)) #1 - 10 = 2*5, therefore μ(10) = (-1)*(-1) = 1 print(Mobius(9)) #0 - Divisble by 3*3 print(Mobius(7)) #-1 - 7 is prime therefore μ(7) = -1
Note
returns 0 if n is divisible by p^2, where p is a prime
returns (-1)^k, where k is number of distinct prime factors
- mathslib.numtheory.mobius_k_sieve(limit, k)[source]¶
A sieve for the Generalized Mobius function, the mathematics of this function can be read in the following PDF
- Parameters:
limit – An integer
k – An integer
- Returns:
An array where array[x] = μ(k, x)
print(mobius_k_sieve(10, 2)) #[0, 1, -1, -1, 0, -1, 1, -1, 0, 0, 1] print(mobius_k_sieve(10, 3)) #[0, 1, -1, -1, -1, -1, 1, -1, 0, -1, 1]
- mathslib.numtheory.count_k_free(n, k)[source]¶
A function that counts the integers ≤ n which are k-power free. count_k_free(n, 2) would count the number of squarefree integers. The mechanics of this function come from this PDF
- Parameters:
n – An integer
k – An integer
- Returns:
The number of integers ≤ n which are k-power free
From Project Euler Problem 193
print(count_k_free(2**50, 2)) #684465067343069
- mathslib.numtheory.ppt(limit, non_primitive=True)[source]¶
Generates all Pythagorean Triplets up to the limit
- Parameters:
limit – An integer, will generate all Pythagorean Triplets such that no side is longer than the limit
non_primitive – Optional boolean value, If True, returns all triplets, if False returns only primitive triplets
- Returns:
A list containing all desired triplets
print(ppt(20)) #[[3, 4, 5], [6, 8, 10], [9, 12, 15], [12, 16, 20], [5, 12, 13], [15, 8, 17]] print(ppt(20, False)) #[[3, 4, 5], [5, 12, 13], [15, 8, 17]] print(len(ppt(100, False))) #16
- mathslib.numtheory.legendre_factorial(x)[source]¶
Implementation of Legendres’ Formula
- Parameters:
x – An integer
- Returns:
A dictionary containing the prime factorisation of x!
print(legendre_factorial(6)) #{2: 4, 3: 2, 5: 1}
- mathslib.numtheory.k_smooth_numbers(max_prime, limit)[source]¶
Find all k ≤ max_prime smooth numbers up to the limit
- Parameters:
max_prime – The maximum prime allowed
limit – limit up till which to find max_prime smooth numbers
- Returns:
A list containing all k ≤ max_prime smooth numbers less that limit
From Project Euler Problem 204
print(len(k_smooth_numbers(5, 10**8))) #1105
- mathslib.numtheory.k_powerful(k, limit, count=True)[source]¶
Find all k-powerful numbers less than or equal to upper_bound. Inspired by Rosetta
- Parameters:
k – k, representing k-powerful
limit – limit up till which to k-powerful numbers
count – Optional, Boolean
- Returns:
if count is True, it counts the number of k-powerful numbers, otherwise it will return them as a list
print(kpowerful(2, 10^2)) #14 print(kpowerful(2, 10^2, False)) #[1, 4, 8, 9, 16, 25, 27, 32, 36, 49, 64, 72, 81, 100]
- mathslib.numtheory.legendre_symbol(a, p)[source]¶
Finds the legendre symbol of a/p
- Parameters:
a – An integer
p – An odd prime
- Results:
The legendre symbol of a/p
print(legendre_symbol(3, 3)) #0 print(legendre_symbol(10, 31)) #1 print(legendre_symbol(2, 11)) #-1
Note
returns 1 if a is a quadratic residue modulo p and p does not divide a
returns -1 if a is a non-quadratic residue modulo p
returns 0 if p divides a
- mathslib.numtheory.tonelli_shanks(a, p)[source]¶
Implementation of Tonelli Shanks algorithm
Full credit for this alogrithm goes to Eli Bendersky
- Parameters:
a – An integer
p – An integer
- Returns:
solution to x^2 = a (mod p)
print(tonelli_shanks(5, 41)) #28
Note
This function solves the congruence of the form x^2 = a (mod p) and returns x. Note that p - x is also a root.
0 is returned if no square root exists for these a and p.
- mathslib.numtheory.chinese_remainder_theorem(a1, a2, n1, n2)[source]¶
Simple Chinese Remiander Theorem to solve x = a1 mod n1, x = a2 mod n2
- Parameters:
a1 – An integer
a2 – An integer
n1 – An integer
n2 – An integer
- Returns:
Unique solution to x = a1 mod n1, x = a2 mod n2
#We solve x = 2 mod 3 = 3 mod 5 = 2 mod 7 #First we solve x = 2 mod = 3 mod 5 print(chinese_remainder_theorem(2, 3, 3, 5)) #8 #Then we solve x = 8 mod 15 = 2 mod 7 print(chinese_remainder_theorem(8, 2, 15, 7)) #23
- mathslib.numtheory.generalised_CRT(a1, a2, n1, n2)[source]¶
A generalised Chinese Remiander Theorem which solves for non-coprime moduli
- Parameters:
a1 – An integer
a2 – An integer
n1 – An integer
n2 – An integer
- Returns:
Unique solution to x = a1 mod n1, x = a2 mod n2
print(generalised_CRT(2, 3, 3, 5)) #8, note that we can use ChineseRemainderTheorem function for this case print(generalised_CRT(2, 4, 4, 6)) #10 print(generalised_CRT(3, 4, 4, 6)) #'No solution'
- mathslib.numtheory.frobenius_number(*integers)[source]¶
Generates the Frobenius Number for given integers.
The below algorithm is based on Faster Algorithms for Frobenius Numbers specifically, this is an implementation of their Breadth-First Method which you may find on page 9
- Param:
integers
- Returns:
Frobenius number
print(frobenius_number(3, 5)) #7 print(frobenius_number(6, 9, 20)) #43 print(frobenius_number(1000, 1476, 3764, 4864, 4871, 7773)) #47350
mathslib.primes module¶
Prime related functions
Author: Igor van Loo
- mathslib.primes.prime_sieve(limit, segment=False, values=True)[source]¶
A prime sieve I made with a few different options
- Parameters:
limit – The limit up till which the function will generate primes
segment – Optional boolean value, if segment == True, it will perform a segmented sieve
values – Optional boolean value, if values == False, it will return an array such that array[x] = True if x is prime
- Returns:
All primes < limit
print(prime_sieve(50)) #[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47] print(prime_sieve(10, values = False)) #[False, False, True, True, False, True, False, True, False, False, False] print([i for (i, isprime) in enumerate(prime_sieve(10, values = False)) if isprime]) #[2, 3, 5, 7]
- mathslib.primes.is_prime(x)[source]¶
A simple is prime function, checks if a number is prime
- Parameters:
x – An integer
- Returns:
True if x is prime, False otherwise
print(is_prime(10)) #False print(is_prime(160517089)) #True
- mathslib.primes.prime_factors(n)[source]¶
Finds all the prime factors of n
- Parameters:
n – An integer
- Returns:
A dictionary containing the prime divisors as keys and value as the corresponding exponent of the prime
print(prime_factors(123123)) #{3: 1, 7: 1, 11: 1, 13: 1, 41: 1} print(prime_factors(1123619623)) #{7: 1, 160517089: 1}
- mathslib.primes.primepi(x)[source]¶
Primepi function is commonly known as Prime Counting Function
This function computes primepi(x) based on the Meissel-Lehmer Method
The following article by Adithya Ganesh helped me a lot in understanding and implementing this function
- Parameters:
x – An integer
- Returns:
primepi(x)
print(primepi(10**6)) #78498 print(primepi(10**7)) #664579 print(primepi(10**8)) #5761455 print(primepi(10**9)) #50847534
- mathslib.primes.primepi_sieve(limit)[source]¶
Primepi function is commonly known as Prime Counting Function
This function generates an array such that array[x] = primepi(x)
- Parameters:
limit – An integer,
- Returns:
An array length limit such that array[x] = primepi(x)
print(primepi_sieve(10)) #[0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4]
- mathslib.primes.sum_of_primes(n)[source]¶
Ultra fast sum of Primes made by Lucy The HedgeHog on Project Euler
You may view it here once you’ve completed problem 10
- Parameters:
n – An integer
- Returns:
The sum of all primes up till n
print(sum_of_primes(2*10**6)) #142913828922 print(sum_of_primes(10**10)) #2220822432581729238
- mathslib.primes.fermat_primality_test(n, tests=2)[source]¶
-
- Parameters:
n – The integer to be tested
tests – Optional, Number of tests to make. The default is 2
- Returns:
True if n is probably prime
print(fermat_primality_test(17969800575241)) #True and it is actually True print(fermat_primality_test(101101)) #True but it is wrong 101101 is not prime print(fermat_primality_test(101101, 6)) #False, after using 6 tests we see that it is not prime
Note
This function will always guess a prime correctly due to Fermats Theorem, but may guess a composite to be a prime. Therefore, it is very useful when we test large numbers, otherwise it is dangerous to use, and hence if n < 10^5 the program will automatically use the is_prime function
You can test more terms to make it more accurate
- mathslib.primes.miller_primality_test(n, millerrabin=False, numoftests=2)[source]¶
The Miller Primality Test with the option to use the Miller-Rabin test
- Parameters:
n – The integer to be tested
millerrabin – Optional, default False. Decides with the use Miller-Rabin or Miller primality test
numoftests – Optional, default is 2. If millerrabin is True, it uses numoftests bases
- Returns:
True if n is probably prime, False if n is not prime
print(miller_primality_test(17969800575241)) #True print(miller_primality_test(101101)) #False print(len([x for x in range(1, 10**6) if miller_primality_test(x, True, 1)])) #78544, 46 more primes than needed print(len([x for x in range(1, 10**6) if miller_primality_test(x, True, 2)])) #78498, correct now
Note
Automatically uses the Miller Primality Test to get an exact an answer if n < 3317044064679887385961981 and swaps to using the first 17 primes, but no longer guarantees a correct answer. You may optionally use a regular miller-rabin test with a specified number of tests
mathslib.linalg module¶
Various Linear Algebra Functions
Author: Igor van Loo
- mathslib.linalg.gauss_jordan_elimination(matrix, augmentedpart=None)[source]¶
Performs Gauss Jordan Elimination on the given matrix
- Parameters:
matrix – Matrix to perform Algoithm on
augmentedpart – Optional argument, will attach the augmented part onto the matrix and then perform the algorithm
- Returns:
True if algorithm was successful, false otherwise
matrix = [[2, 1, -1], [-3, -1, 2], [-2, 1, 2]] print(gauss_jordan_elimination(matrix)) #True
Note
This function simply performs the Gauss Jordan Algorithm, it is used with with solve and inverse to solve Ax = b, and the find the inverse of a matrix
- mathslib.linalg.solve(M, b)[source]¶
Finds the solution, x, to the equation Mx = b
- Parameters:
M – A Matrix
b – A Vector
- Returns:
The Vector x, or an error message
matrix = [[2, 1, -1], [-3, -1, 2], [-2, 1, 2]] b = [[8], [-11], [-3]] print(solve(matrix, b)) #[[2.0], [3.0], [-1.0]]
- mathslib.linalg.inverse(matrix)[source]¶
Finds the inverse of the given matrix by performing Gauss Jordan Elimination
- Parameters:
matrix – Matrix to be inverted
- Returns:
Inverted matrix, or an error message
matrix = [[1, -1, 0], [-8, 9, -1], [-9, 0, 10]] print(inverse(matrix)) #[[90.0, 10.0, 1.0], [89.0, 10.0, 1.0], [81.0, 9.0, 1.0]]
- mathslib.linalg.determinant(matrix)[source]¶
Finds the determinant of a matrix
- Parameters:
matrix – Matrix
- Returns:
det(Matrix)
matrix = [[7, -1, 0], [-8, 9, -1], [-9, 0, 10]] print(determinant(matrix)) #541.0
- mathslib.linalg.matrix_addition(A, B, subtract=False)[source]¶
Performs matrix addition/subtraction on matrix A
- Parameters:
A – First Matrix
B – Second Matrix
subtract – If True, will perform matrix subtraction
- Returns:
A + B
matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] print(matrix_addition(matrix, matrix)) #[[2, 0, 0], [0, 2, 0], [0, 0, 2]] print(matrix_addition(matrix, matrix, True)) #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
- mathslib.linalg.identity(l, val=1)[source]¶
Generats an Square Identity Matrix
- Parameters:
l – Size of matrix
val – diagonal values, default is 1
- Returns:
val * identity matrix of size l
print(identity(2)) #[[1, 0], [0, 1]] print(identity(2, 5)) #[[5, 0], [0, 5]]
- mathslib.linalg.concatenate(A, B)[source]¶
Concatenates 2 matrices, A and B
- Parameters:
A – First Matrix
B – Second Matrix
- Returns:
A concatenated with B
A = [[1, 0], [0, 1]] print(concatenate(A, A)) #[[1, 0, 1, 0], [0, 1, 0, 1]]
Note
This is a helper function for inverse and solve
- mathslib.linalg.argmax(alist)[source]¶
Finds the argmax of a list
- Parameters:
alist – A list
- Returns:
the arg max of the list
print(argmax([1, 3, 2])) #1
mathslib.fib module¶
Fibonacci related functions
Author: Igor van Loo
- mathslib.fib.fibonacci(n)[source]¶
Finds the n-th Fibonacci using matrix exponentiation Method is outlined here
- Parameters:
n – An integer
- Returns:
The n-th Fibonacci number
print(fibonacci(100)) #354224848179261915075
- mathslib.fib.fib_till(limit)[source]¶
Finds all Fibonacci number up till a limit
- Parameters:
limit – An integer
- Returns:
A list containing all the fibonacci numbers < limit
print(fib_till(100)) #[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] print(sum(fib_till(1000))) #2583
- mathslib.fib.zeckendorf_representation(x)[source]¶
Finds the Zeckendorf Representation of x
- Parameters:
x – An integer
- Returns:
A list containing the zeckendorf representation of x
print(zeckendorf_representation(64)) #[55, 8, 1]
mathslib.algorithms module¶
Various known algorithms. They are graph theory and optimization related
Author: Igor van Loo
- mathslib.algorithms.prims_algorithm(matrix)[source]¶
Implementation of Prim’s algorithm It finds a Minimum Spanning Tree (MST) for a weighted undirected graph.
- Parameters:
matrix – Takes a Adjacency matrix as input
- Returns Weight:
The sum of the minimum spanning tree
- Returns mask:
The corresponding Adjacency matrix of the MST
Example from Project Euler Problem 107
matrix = [[0, 16, 12, 21, 0, 0, 0], [16, 0, 0, 17, 20, 0, 0], [12, 0, 0, 28, 0, 31, 0], [21, 17, 28, 0, 18, 19, 23], [0, 20, 0, 18, 0, 0, 11], [0, 0, 31, 19, 0, 0, 27], [0, 0, 0, 23, 11, 27, 0]] print(prims_algorithm(matrix)) #(93, #[[0, 16, 12, 0, 0, 0, 0], #[16, 0, 0, 17, 0, 0, 0], #[12, 0, 0, 0, 0, 0, 0], #[0, 17, 0, 0, 18, 19, 0], #[0, 0, 0, 18, 0, 0, 11], #[0, 0, 0, 19, 0, 0, 0], #[0, 0, 0, 0, 11, 0, 0]])
- mathslib.algorithms.dijkstras_algorithm(graph, start_node=0, INFINITY=10000000000)[source]¶
Implementation of Dijkstra’s algorithm It finds the the shortest paths between nodes in a graph
- Parameters:
graph – Takes an adjacency list as input
start_node – Optional tuple, default is node 0.
INFINITY – Optional integer, default is 10^10. It is used to set the “Infinty” value
- Returns:
Shortest path between start_node and all other nodes
Example from the wikipedia page
g = [[[1, 7], [2, 9], [5, 14]], [[0, 7], [2, 10], [3, 15]], [[0, 9], [1, 10], [3, 11], [5, 2]], [[1, 15], [2, 11], [4, 6]], [[3, 6], [5, 9]], [[0, 14], [2, 2], [4, 9]] ] print(dijkstras_algorithm(g)) #[0, 7, 9, 20, 20, 11]
Note
A quick comment on this adjacency list. The way it works is for example g[i] contains all the nodes node i is connected to. For example, using the above graph g[0] = [[1, 7], [2, 9], [5, 14]] means node 0 is connected to nodes 1, 2, and 5 and the weight between the edges are 7, 9, and 14 respectively
- mathslib.algorithms.floyd_warshall_algorithm(graph, INFINITY=10000000000)[source]¶
Implementation of the Floyd-Warshall algorithm It finds the the shortest paths between every node in the graph to every node in the graph
- Parameters:
graph – Takes an adjacency list as input
INFINITY – Optional integer, default is 10^10. It is used to set the “Infinty” value
- Returns:
Shortest path between every node to every node
Example from the wikipedia page
g = [[[1, 7], [2, 9], [5, 14]], [[0, 7], [2, 10], [3, 15]], [[0, 9], [1, 10], [3, 11], [5, 2]], [[1, 15], [2, 11], [4, 6]], [[3, 6], [5, 9]], [[0, 14], [2, 2], [4, 9]] ] print(floyd_warshall_algorithm(g)) #[[0, 7, 9, 20, 20, 11], # [7, 0, 10, 15, 21, 12], # [9, 10, 0, 11, 11, 2], # [20, 15, 11, 0, 6, 13], # [20, 21, 11, 6, 0, 9], # [11, 12, 2, 13, 9, 0]]
Note
This process is like applying Dijkstras Algorithm on every node
- mathslib.algorithms.knap_sack(values, weights, n, W, no_values=True)[source]¶
Implementation of dynamic programming solution to the 0-1 Knapsack Problem
- Parameters:
values – A list of values
weights – A list with weight of corresponding values
n – Number of items
W – Desired weight
no_values – Optional boolean value
- Returns:
If no_values == True - It returns the optimal sum of weights
If no_values == False - it returns the entire array used to build up the solution
values = [60, 100, 120] weights = [10, 20, 30] W = 50 n = len(values) print(knap_sack(values, weights, n, W)) #220
- mathslib.algorithms.knap_sack_values(values, weights, n, W)[source]¶
Extension to KnapSack function It finds the actual values used to obtain the optimal sum
- Parameters:
values – A list of values
weights – A list with weight of corresponding values
n – Number of items
W – Desired weight
- Returns:
A set with the optimal values which form the solution to the knapsack problem
values = [60, 100, 120] weights = [10, 20, 30] W = 50 n = len(values) print(knap_sack_values(values, weights, n, W)) #{20, 30}
- mathslib.algorithms.BFS(g, start_node=0, end_node=False)[source]¶
Implementation of Breadth First Search
- Parameters:
g – An Adjacency List
start_node – Optional, pick your start node. Default is 1st node
end_node – Optional, pick your end node. Default is last node
- Returns:
A list of nodes which create a path from your start_node to end_node if it exists
G = [[4, 1], [0, 5], [6, 3], [2, 7], [0, 8], [1, 6], [2, 5, 10], [3, 11], [4, 9], [8, 13], [6], [7, 15], [13], [9, 12, 14], [13, 15], [11, 14] ] print(BFS(G)) #[0, 4, 8, 9, 13, 14, 15]
Note
A quick comment on adjacency lists. The way it works is for example G[i] contains all the nodes node i is connected to. For example using the above graph G[0] = [4, 1] means node 0 is connected to nodes 1, and 4.
- mathslib.algorithms.DFS(g, start_node=0, end_node=False)[source]¶
Implementation of Depth First Search
- Parameters:
g –
start_node – Optional, pick your start node. Default is 1st node
end_node – Optional, pick your end node. Default is last node
- Returns:
A list of nodes which create a path from your start_node to end_node if it exists
G = [[4, 1], [0, 5], [6, 3], [2, 7], [0, 8], [1, 6], [2, 5, 10], [3, 11], [4, 9], [8, 13], [6], [7, 15], [13], [9, 12, 14], [13, 15], [11, 14] ] print(DFS(G)) #[0, 1, 5, 6, 2, 3, 7, 11, 15]
- mathslib.algorithms.convex_hull_gift_wrapping(pts)[source]¶
Implementation of the Convex Hull Gift Wrapping Algorithm
- Parameters:
pts – A list containing 2D points
- Returns:
A list of points consisting of the convex hull starting from leftmost point going around
mathslib.simple module¶
Various simple functions
Author: Igor van Loo
- mathslib.simple.n_choose_r(n, r)[source]¶
n choose r function
- Parameters:
n – An integer
r – An integer
- Returns:
n choose r
print(n_choose_r(50, 30)) #47129212243960
- mathslib.simple.number_to_base(n, b)[source]¶
Changes n from base 10 to base b
- Parameters:
n – An integer, number to be changed
b – An integer, base in question
- Returns:
n in base b
print(number_to_base(10, 2)) #[1, 0, 1, 0] print(number_to_base(10, 3)) #[1, 0, 1]
- mathslib.simple.extended_euclidean_algorithm(a, b)[source]¶
Standard Extended Euclidean Algorithm
- Parameters:
a – An integer
b – An integer
- Returns:
A tuple (g, s, t) where gcd(a, b) = g = as + bt
print(extended_euclidean_algorithm(240, 46)) #(2, -9, 47)
- mathslib.simple.lcm(a_list)[source]¶
Finds the lcm of a list of numbers
- Parameters:
alist – A list containing integers
- Returns:
The lcm of all numbers in the list
print(lcm([2, 3])) #6 print(lcm([2, 4, 5, 7])) #140 print(lcm([8345, 23579, 174])) #34237415370
- mathslib.simple.mod_division(a, b, m)[source]¶
Finds a/b mod m
- Parameters:
a – An integer, the numerator
b – An integer, the denominator
m – An integer, the modulus
- Returns:
a/b mod m
print(mod_division(8, 4, 5)) #2
- mathslib.simple.bisect(alist, goal)[source]¶
This function is equivalent to bisect_right from the bisect module
- Parameters:
alist – A list
goal – A number
- Returns:
index i of A such that A[i - 1] < g <= A[i]
print(bisect([2, 3, 5, 7], 6)) #3 since A[2] = 5 < 6 <= A[3] = 7
- mathslib.simple.is_clockwise(a, b, c)[source]¶
Finds if 3 points a going to b going to c are in clockwise order. It is used in convex hull algorithm
- Parameters:
a – A tuple, representing a point in 2D
b – A tuple, representing a point in 2D
c – A tuple, representing a point in 2D
- Returns:
True if point are in clockwise direction, otherwise False
Module contents¶
Library of Mathematical functions and Algorithms
Author: Igor van Loo