23 March 2021

Number Theory, Continued

Last time we learned about the relation | on integers. We defined d|a if d divides into a evenly. In Python we test for this using the predicate a%d == 0. We also know that for any integer d, d | 0 and that for any integer a, 1|a and -1|a.

Hence we can ignore sign when looking at divisibility. However we will place our focus on nonnegative integers.

If a and b are integers that are not both 0, we define gcd(a,b) to be the greatest common divisor of If a and b. Such a thing exists for two reason. Firstly, 1 is a divisor of all integers, so any pair of integers has 1 as a common divisor. Secondly, for any integers a b, all common divisors must occur between 1 and min(a,b). So, we can loop through these numbers and find the common divisor that is the largest.

This python function will check to see if d is a common divisor a and b


def is_common_divisor(d, a, b):
    return a%d == 0 and b%d == 0

So here is one way to compute a gcd.


def gcd(a,b):
    if a == 0 and b == 0:
        raise ValueError
    a = abs(a)
    b = abs(b)  ##throw out signs
    n = min(a,b)
    out = 1
    for k in range(2, n+1):
        if is_common_divisor(k, a b):
            out = k
    return out

This algorithm is O(n) because it is at worst proportional to the size of the problem. You have to perform all of the checks from 2 to n - 1. However, there is a smarter way to do this.

Euclid's Algorithm

Last Time We learned that if b = a*q + r that gcd(b,a) = gcd(a,r).

We also know this is true for all integers b and a with the proviso that a != 0.

b = a*(b//a) + b%a
b = 345
a = 17
b//a = 20
b%a = 5

gcd(345, 17) = gcd(17, 5) = gcd(5, 2) = gcd(2, 1) = gcd(1,0) = 1

b = 17
a = 5
b//a = 3
b%a = 2
              b%a
b     a        r
345 = 17(20) + 5
17  = 5(3)   + 2    b, a = a, b%a  "shift"
5   = 2(2)   + 1
2   = 1(2)   + 0

while b%a > 0:
    b, a,= a, b%a

Nice example in a video

Warning: Explicit This video shows how to get an explicit formula for the Fibonacci numbers.

Prime Numbers


                          552
                         /   \
                        4    138
                       / \   /  \
                      2  2  6   23
                           / \
                          2   3