diff --git a/Cryptography/tools/finding_gcd.py b/Cryptography/tools/finding_gcd.py new file mode 100755 index 0000000..12163d7 --- /dev/null +++ b/Cryptography/tools/finding_gcd.py @@ -0,0 +1,26 @@ +#!/usr/bin/python + + +def finding_gcd(a, b): + ''' implements the greatest common divider algorithm ''' + while(b != 0): + result = b + a, b = b, a % b + return result + + +def test_finding_gcd(): + number1 = 21 + number2 = 12 + assert(finding_gcd(number1, number2) == 3) + print('Tests passed!') + +if __name__ == '__main__': + test_finding_gcd() + + + + + + + diff --git a/Cryptography/tools/finding_if_prime.py b/Cryptography/tools/finding_if_prime.py new file mode 100755 index 0000000..7a7d920 --- /dev/null +++ b/Cryptography/tools/finding_if_prime.py @@ -0,0 +1,57 @@ +#!/usr/bin/python + +import math +import random + +def finding_prime(number): + ''' find whether a number is prime in a simple way''' + num = abs(number) + if num < 4 : return True + for x in range(2, num): + if num % x == 0: + return False + return True + + +def finding_prime_sqrt(number): + ''' find whether a number is prime as soon as it rejects all candidates up to sqrt(n) ''' + num = abs(number) + if num < 4 : return True + for x in range(2, int(math.sqrt(num)) + 1): + if number % x == 0: + return False + return True + + +def finding_prime_fermat(number): + ''' find whether a number is prime with Fermat's theorem, using probabilistic tests ''' + if number <= 102: + for a in range(2, number): + if pow(a, number- 1, number) != 1: + return False + return True + else: + for i in range(100): + a = random.randint(2, number - 1) + if pow(a, number - 1, number) != 1: + return False + return True + + + +def test_finding_prime(): + number1 = 17 + number2 = 20 + assert(finding_prime(number1) == True) + assert(finding_prime(number2) == False) + assert(finding_prime_sqrt(number1) == True) + assert(finding_prime_sqrt(number2) == False) + assert(finding_prime_fermat(number1) == True) + assert(finding_prime_fermat(number2) == False) + print('Tests passed!') + + +if __name__ == '__main__': + test_finding_prime() + + diff --git a/Cryptography/tools/generate_prime.py b/Cryptography/tools/generate_prime.py new file mode 100755 index 0000000..9451dfb --- /dev/null +++ b/Cryptography/tools/generate_prime.py @@ -0,0 +1,33 @@ +#!/usr/bin/python + +import math +import random +import sys +from finding_prime import finding_prime_sqrt + + +def generate_prime(number=3): + ''' return a n-bit prime ''' + while 1: + p = random.randint(pow(2, number-2), pow(2, number-1)-1) + p = 2 * p + 1 + if finding_prime_sqrt(p): + return p + + +if __name__ == '__main__': + if len(sys.argv) < 2: + print ("Usage: generate_prime.py number") + sys.exit() + else: + number = int(sys.argv[1]) + print(generate_prime(number)) + + + + + + + + + diff --git a/Cryptography/tools/quick_select.py b/Cryptography/tools/quick_select.py new file mode 100755 index 0000000..b36adbc --- /dev/null +++ b/Cryptography/tools/quick_select.py @@ -0,0 +1,35 @@ +def quickSelect(seq, k): + # this part is the same as quick sort + len_seq = len(seq) + if len_seq < 2: return seq + + ipivot = len_seq // 2 + pivot = seq[ipivot] + + smallerList = [x for i,x in enumerate(seq) if x <= pivot and i != ipivot] + largerList = [x for i,x in enumerate(seq) if x > pivot and i != ipivot] + + # here starts the different part + m = len(smallerList) + if k == m: + return pivot + elif k < m: + return quickSelect(smallerList, k) + else: + return quickSelect(largerList, k-m) + + + + +if __name__ == '__main__': + # Checking the Answer + seq = [10, 60, 100, 50, 60, 75, 31, 50, 30, 20, 120, 170, 200] + + # we want the middle element + k = len(seq) // 2 + + # Note that this only work for odd arrays, since median in + # even arrays is the mean of the two middle elements + print(quickSelect(seq, k)) + import numpy + print numpy.median(seq) \ No newline at end of file