Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Topological Sort #1302

Merged
merged 4 commits into from
Oct 18, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions blockchain/chinese_remainder_theorem.py
Original file line number Diff line number Diff line change
@@ -44,7 +44,7 @@ def chinese_remainder_theorem(n1, r1, n2, r2):
(x, y) = extended_euclid(n1, n2)
m = n1 * n2
n = r2 * x * n1 + r1 * y * n2
return ((n % m + m) % m)
return (n % m + m) % m


# ----------SAME SOLUTION USING InvertModulo instead ExtendedEuclid----------------
@@ -84,8 +84,8 @@ def chinese_remainder_theorem2(n1, r1, n2, r2):
# import testmod for testing our function
from doctest import testmod

if __name__ == '__main__':
testmod(name='chinese_remainder_theorem', verbose=True)
testmod(name='chinese_remainder_theorem2', verbose=True)
testmod(name='invert_modulo', verbose=True)
testmod(name='extended_euclid', verbose=True)
if __name__ == "__main__":
testmod(name="chinese_remainder_theorem", verbose=True)
testmod(name="chinese_remainder_theorem2", verbose=True)
testmod(name="invert_modulo", verbose=True)
testmod(name="extended_euclid", verbose=True)
16 changes: 10 additions & 6 deletions blockchain/diophantine_equation.py
Original file line number Diff line number Diff line change
@@ -17,7 +17,9 @@ def diophantine(a, b, c):
"""

assert c % greatest_common_divisor(a, b) == 0 # greatest_common_divisor(a,b) function implemented below
assert (
c % greatest_common_divisor(a, b) == 0
) # greatest_common_divisor(a,b) function implemented below
(d, x, y) = extended_gcd(a, b) # extended_gcd(a,b) function implemented below
r = c / d
return (r * x, r * y)
@@ -32,6 +34,7 @@ def diophantine(a, b, c):

# n is the number of solution you want, n = 2 by default


def diophantine_all_soln(a, b, c, n=2):
"""
>>> diophantine_all_soln(10, 6, 14)
@@ -66,6 +69,7 @@ def diophantine_all_soln(a, b, c, n=2):

# Euclid's Algorithm


def greatest_common_divisor(a, b):
"""
>>> greatest_common_divisor(7,5)
@@ -117,8 +121,8 @@ def extended_gcd(a, b):
# import testmod for testing our function
from doctest import testmod

if __name__ == '__main__':
testmod(name='diophantine', verbose=True)
testmod(name='diophantine_all_soln', verbose=True)
testmod(name='extended_gcd', verbose=True)
testmod(name='greatest_common_divisor', verbose=True)
if __name__ == "__main__":
testmod(name="diophantine", verbose=True)
testmod(name="diophantine_all_soln", verbose=True)
testmod(name="extended_gcd", verbose=True)
testmod(name="greatest_common_divisor", verbose=True)
16 changes: 9 additions & 7 deletions blockchain/modular_division.py
Original file line number Diff line number Diff line change
@@ -70,6 +70,7 @@ def modular_division2(a, b, n):

# Extended Euclid's Algorithm : If d divides a and b and d = a*x + b*y for integers x and y, then d = gcd(a,b)


def extended_gcd(a, b):
"""
>>> extended_gcd(10, 6)
@@ -116,6 +117,7 @@ def extended_euclid(a, b):
# Euclid's Lemma : d divides a and b, if and only if d divides a-b and b
# Euclid's Algorithm


def greatest_common_divisor(a, b):
"""
>>> greatest_common_divisor(7,5)
@@ -140,10 +142,10 @@ def greatest_common_divisor(a, b):
# Import testmod for testing our function
from doctest import testmod

if __name__ == '__main__':
testmod(name='modular_division', verbose=True)
testmod(name='modular_division2', verbose=True)
testmod(name='invert_modulo', verbose=True)
testmod(name='extended_gcd', verbose=True)
testmod(name='extended_euclid', verbose=True)
testmod(name='greatest_common_divisor', verbose=True)
if __name__ == "__main__":
testmod(name="modular_division", verbose=True)
testmod(name="modular_division2", verbose=True)
testmod(name="invert_modulo", verbose=True)
testmod(name="extended_gcd", verbose=True)
testmod(name="extended_euclid", verbose=True)
testmod(name="greatest_common_divisor", verbose=True)
47 changes: 47 additions & 0 deletions graphs/g_topological_sort.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Author: Phyllipe Bezerra (https://github.com/pmba)

clothes = {
0: "underwear",
1: "pants",
2: "belt",
3: "suit",
4: "shoe",
5: "socks",
6: "shirt",
7: "tie",
8: "clock",
}

graph = [[1, 4], [2, 4], [3], [], [], [4], [2, 7], [3], []]

visited = [0 for x in range(len(graph))]
stack = []


def print_stack(stack, clothes):
order = 1
while stack:
cur_clothe = stack.pop()
print(order, clothes[cur_clothe])
order += 1


def dfs(u, visited, graph):
visited[u] = 1
for v in graph[u]:
if not visited[v]:
dfs(v, visited, graph)

stack.append(u)


def top_sort(graph, visited):
for v in range(len(graph)):
if not visited[v]:
dfs(v, visited, graph)


if __name__ == "__main__":
top_sort(graph, visited)
print(stack)
print_stack(stack, clothes)
14 changes: 8 additions & 6 deletions machine_learning/k_nearest_neighbours.py
Original file line number Diff line number Diff line change
@@ -5,12 +5,13 @@

data = datasets.load_iris()

X = np.array(data['data'])
y = np.array(data['target'])
classes = data['target_names']
X = np.array(data["data"])
y = np.array(data["target"])
classes = data["target_names"]

X_train, X_test, y_train, y_test = train_test_split(X, y)


def euclidean_distance(a, b):
"""
Gives the euclidean distance between two points
@@ -21,6 +22,7 @@ def euclidean_distance(a, b):
"""
return np.linalg.norm(np.array(a) - np.array(b))


def classifier(train_data, train_target, classes, point, k=5):
"""
Classifies the point using the KNN algorithm
@@ -43,13 +45,13 @@ def classifier(train_data, train_target, classes, point, k=5):
for data_point in data:
distance = euclidean_distance(data_point[0], point)
distances.append((distance, data_point[1]))
# Choosing 'k' points with the least distances.
# Choosing 'k' points with the least distances.
votes = [i[1] for i in sorted(distances)[:k]]
# Most commonly occuring class among them
# Most commonly occuring class among them
# is the class into which the point is classified
result = Counter(votes).most_common(1)[0][0]
return classes[result]


if __name__ == "__main__":
print(classifier(X_train, y_train, classes, [4.4, 3.1, 1.3, 1.4]))
print(classifier(X_train, y_train, classes, [4.4, 3.1, 1.3, 1.4]))
2 changes: 1 addition & 1 deletion maths/fibonacci_sequence_recursion.py
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ def recur_fibo(n):
>>> [recur_fibo(i) for i in range(12)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
"""
return n if n <= 1 else recur_fibo(n-1) + recur_fibo(n-2)
return n if n <= 1 else recur_fibo(n - 1) + recur_fibo(n - 2)


def main():
3 changes: 2 additions & 1 deletion maths/sum_of_arithmetic_series.py
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ def sum_of_series(first_term, common_diff, num_of_terms):
>>> sum_of_series(1, 10, 100)
49600.0
"""
sum = ((num_of_terms/2)*(2*first_term+(num_of_terms-1)*common_diff))
sum = (num_of_terms / 2) * (2 * first_term + (num_of_terms - 1) * common_diff)
# formula for sum of series
return sum

@@ -19,4 +19,5 @@ def main():

if __name__ == "__main__":
import doctest

doctest.testmod()
1 change: 1 addition & 0 deletions sorts/stooge_sort.py
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@ def stooge(arr, i, h):
# Recursively sort first 2/3 elements
stooge(arr, i, (h - t))


if __name__ == "__main__":
user_input = input("Enter numbers separated by a comma:\n").strip()
unsorted = [int(item) for item in user_input.split(",")]