Pre: Demo of Collatz conjecture =============================== Corresponding lab sheet: ------------------------ - `Recursion and Reading and writing to file `_ Objectives ---------- - Motivate the use of recursion and writing/reading to file through the study of the Collatz conjecture; - Describe recursion; - Describe reading and writing to file. Notes ----- Tell students we are going to investigate a particular mathematical process defined by the following recursive relationship: .. math:: f(n) = \begin{cases} n / 2& \text{ if }n = 0 \text{mod } 2\\ 3n + 1& \text{ if }n = 0 \text{mod } 2\\ \end{cases} **Ask students what :math:`f(2)` is?** Realise that we have what we will call a base case: computing :math:`n=2` essentially ends the process. **What happens when we recursively call :math:`f(n)`?** Demonstrate what is meant by this with :math:`n=3`: .. math:: \begin{align} f(3) &= 3\times 3 + 1 = 10\\ f(10) &= 10/2 = 5\\ f(5) &= 3\times 5 + 1 = 16\\ f(16) &= 16/2 = 8\\ f(8) &= 8/2 = 4\\ f(4) &= 4/2 = 2\\ f(2) &= 2/1 = 1 \end{align} We see that with :math:`n=3` the process eventually finishes. **Ask students if they think this will always be the case? Why?** **In groups, using pen and paper repeatedlycompute :math:`f(n)` for :math:`n\in\{2, 3, 4, 5, 6, 7, 8, 9, 10\}** We know it terminates for :math:`n\in\{2,3,4,5,8,10\}`. For :math:`n=6`: .. math:: \begin{align} f(6) &= 6/2 = 3 \end{align} which we know terminates. For :math:`n=7`: .. math:: \begin{align} f(7) &= 3\times 7 + 1 = 22\\ f(22) &= 22/2 = 11\\ f(11) &= 3\times 11 + 1 = 34\\ f(34) &= 34/2 = 17\\ f(17) &= 3\times 17 + 1 = 52\\ f(52) &= 52/2 = 26\\ f(26) &= 26/2 = 13\\ f(13) &= 3\times 13 + 1 = 40\\ f(20) &= 20/2 = 10 \end{align} which we know terminates. **Ask students if they think this will always be the case? Why?** Explain that there is overwhelming evidence that this does indeed always terminate but that we do not know for sure if it is true. **Ask students if they know what this is called?** A conjecture. Mention the following text from the corresponding `wiki page `_: "Paul Erdős said about the Collatz conjecture: 'Mathematics may not be ready for such problems.' He also offered $500 for its solution.[9] Jeffrey Lagarias in 2010 claimed that based only on known information about this problem, 'this is an extraordinarily difficult problem, completely out of reach of present day mathematics.'" **In groups: write some code to check if the process terminates for a given :code:`n`** First let us write the function itself:: >>> def func(N): ... """Function to apply the Collatz transformation to an integer N""" ... if N % 2 == 0: ... return int(N / 2) ... return 3 * N + 1 >>> func(10) 5 >>> func(5) 16 **Describe recursion as having two steps:** - A base case: in our case this is :math:`N=1`. - Recursive relationship: in our case :math:`a(N)=f(a(N - 1))` Let us write the process:: >>> def collatz_process(N, count=0): ... """ ... Recursively call the collatz process and return the number of ... times it was called. This is called the "stopping time". ... """ ... if N == 1: ... return count ... count += 1 ... return collatz_process(func(N), count=count) >>> collatz_process(4) 2 >>> collatz_process(7) 16 **Ask students, to in group discuss the code and check if there are any questions.** Finally, explain that so far essentially all mathematicians have been able to do is test this process numerically and have found that it **always** terminates. One way to do this is to keep track of the results so far on disk:: >>> with open("collatz_data.txt", "w") as f: # doctest: +SKIP ... for N in range(2, 50): # Could swap this for an infinite loop ... stopping_time = collatz_process(N) ... string = str(N) + "," + str(stopping_time) + "\n" ... f.write(string) We could then read this in and check from a given point or perhaps give the file to other to use. Lab sheet --------- Show how these recursion will be gone over in the lab sheet. Also discuss reading and writing: highlight where the files needs to be.