# Variables, conditionals and loops¶

## Pre class email¶

Send the following email before class:

```
Hi all,
I hope you are all well.
This is a brief email to make you aware of a few things:
- The class timetable and weekly schedule for this Semester is available
here: https://vknight.org/cfm/
- This week we have class at 1600 (via Zoom) and we
will be covering this chapter
https://vknight.org/pfm/building-tools/01-variables-conditionals-loops/introduction/main.html.
- This Semester your assessment is a group exercise. I am letting you self
select groups (groups of 4) but will assist anyone unable to find a group.
We will discuss this more today in class.
I am about to send you your draft individual coursework feedback.
**Important** This will come from `vincent.knight@gmail.com` and the subject
will be `DO NOTE REPLY - Coursework mark and feedback`. Note that I consider
this first feedback I send you to be a *draft*. As it is automatically marked
it is not unlikely that a mistake has crept in. Feel free to get in touch
with me if anything is unclear in the feedback.
Please get in touch if I can assist with anything,
Vince
```

## First meeting¶

After this meeting students should:

Understand the coursework exercise and the group aspect

Understand the how to use a for loop and a while loop

Know what they need to do to prepare for their seventh tutorial and how to make groups.

### Coursework¶

Explain goal of coursework:

- > To build and present a Python library to solve a mathematical problem of your
choice.

How it will be assessed (15 minute presentation and 2 page (max) paper).

Groups of 4. Self select and see instructions in email.

Agree on deadline for formation of group.

I recommend you meet regularly.

Have an agenda for every meeting.

Single point of contact.

### Problem¶

Explain to students that we will be solving the following problem:

A perfect number is a positive integer whose divisors (excluding itself) sum to itself. For example, \(6\) is a perfect number because \(6 = 1 + 2 + 3\).

How many perfect numbers are there less than 20?

What is the next perfect number?

### Solution¶

Group exercise (breakout rooms of 3): ask students to spend 5 minutes writing a plan to tackle that problem (not necessarily carrying out each step).

We start by writing a function that checks if a number is perfect:

```
>>> def is_perfect(n):
... """
... Checks if a number n is perfect.
... """
... return sum(i for i in range(1, n) if (n % i == 0)) == n
>>> is_perfect(5)
False
>>> is_perfect(6)
True
```

Now we can check all numbers up until 20:

```
>>> checks = [is_perfect(n) for n in range(1, 21)]
```

Note that we can combine all booleans using `all`

:

```
>>> all(checks)
False
```

Or `any`

:

```
>>> any(checks)
True
```

We cam also count them (as before) using `sum`

:

```
>>> sum(checks)
1
```

We are there using a list comprehension (as before) **but** we can also use a
for loop:

```
>>> count = 0
>>> for n in range(1, 21):
... if is_perfect(n):
... count += 1
>>> count
1
```

Discuss how the for loop works.

Now to answer the other question, **we do not know** how many times we need to
iterate the code so we use a while loop:

```
>>> n = 7
>>> while not is_perfect(n):
... n += 1
>>> n
28
```

Indeed the prime divisors of 28 are:

```
>>> import sympy as sym
>>> sym.primefactors(28)
[2, 7]
```

And:

```
>>> 1 + 2 + 4 + 7 + 14
28
```

We can repeat the above to find the 3rd perfect number:

```
>>> n = 29
>>> while not is_perfect(n):
... n += 1
>>> n
496
```

Indeed the divisors of 496 are:

```
>>> import sympy as sym
>>> sym.primefactors(496)
[2, 31]
```

And:

```
>>> 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
496
```

## After class email¶

Send the following email after class:

```
Hi all,
A recording of today's class is available at <>.
In this class I went over 2 separate things:
1. The group coursework (please read the end of this email where action is
required).
2. Variables, loops and conditionals.
I recommend working through the following chapter of the class text:
https://vknight.org/pfm/building-tools/01-variables-conditionals-loops/introduction/main.html
If you have any questions I will be in 2.35 on Wednesday from 1000 until
1200 for the first 4 weeks of the course.
IMPORTANT ACTION REQUIRED
For your group coursework you have until <DEADLINE> to form groups with 4
people. I am letting you self select groups. If you do not have a group by
<DEADLINE> I will create a group for you.
Once you have created a group, 1 member of your group must email me (CC'ing
in all other members) with subject: "Group formed"
In the email please tell me the name of your group (you can be imaginative)
and also which member of your group is the point of contact.
Once you have created a group and started working, please use https://forms.office.com/e/qnVdB1KUG7
to record weekly progress.
---
Please get in touch if I can assist with anything,
Vince
```

## Post meeting¶

The main difficulties raised were:

Sets

Modulo

Doing more involved problems

Create a set:

```
>>> set_1 = set((-1, 1, 1, 2, 3, 5))
>>> set_1
{1, 2, 3, 5, -1}
>>> set_2 = set(range(10))
>>> set_2
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
```

Union:

```
>>> set_1 | set_2
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1}
```

Intersection:

```
>>> set_1 & set_2
{1, 2, 3, 5}
```

Set subtraction:

```
>>> set_1 - set_2
{-1}
```

Set inclusion:

```
>>> set_1 <= set_2
False
```

Reasons for using sets:

The ability to to the above operations.

Immediate removal of duplicates.

Checking inclusion.

Run the following timing examples:

```
N = 10 ** 4
numbers_as_range = range(N)
numbers_as_list = list(numbers_as_range)
numbers_as_tuple = tuple(numbers_as_range)
numbers_as_set = set(numbers_as_range)
```

Testing the list:

```
%%timeit
5000 in numbers_as_list
```

Testing the tuple:

```
%%timeit
5000 in numbers_as_tuple
```

Testing the set:

```
%%timeit
5000 in numbers_as_set
```

Testing the range itself:

```
%%timeit
5000 in numbers_as_range
```

Give some examples of modula arithmetic:

```
>>> 5 % 2
1
>>> 17 % 9
8
>>> for i in range(24 * 5):
... print(i % 24)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
```

Discuss how important it is, when building tools to spend time away from the computer. Make the analogy of writing down a recipe before starting to cook.