Week 2 at a glance

We will be learning and practicing to:

TODO:

#FinAid Assignment on Canvas (complete as soon as possible)

Review quiz based on Week 1 class material (due Monday 01/12/2026)

Homework assignment 1 (due Thursday 01/15/2026)

Review quiz based on Week 2 class material (due Monday 01/19/2026)

Week 2 Monday: Sets, functions, and algorithms

Let’s practice with functions related to some of our applications so far.

Recall: We model the collection of user ratings of the four movies Superman, Wicked, KPop Demon Hunters, A Minecraft Movie as the set \(\{-1,0,1\}^4\) . One function that compares pairs of ratings is \[d_0: \{-1,0,1\}^4 \times \{-1,0,1\}^4 \to \mathbb{R}\] given by \[d_0 (~(~ (x_1, x_2, x_3, x_4), (y_1, y_2, y_3, y_4) ~) ~) = \sqrt{ (x_1 - y_1)^2 + (x_2 - y_2)^2 + (x_3 -y_3)^2 + (x_4 -y_4)^2}\]

Notice: any ordered pair of ratings is an okay input to \(d_0\).

Notice: there are (at most) \[(3 \cdot 3 \cdot 3 \cdot 3)\cdot (3 \cdot 3 \cdot 3 \cdot 3) = 3^8 = 6561\] many pairs of ratings. There are therefore lots and lots of real numbers that are not the output of \(d_0\).

Recall: RNA is made up of strands of four different bases that encode genomic information in specific ways.
The bases are elements of the set \(B = \{\texttt{A}, \texttt{C}, \texttt{U}, \texttt{G}\}\). The set of RNA strands \(S\) is defined (recursively) by: \[\begin{array}{ll} \textrm{Basis Step: } & \texttt{A}\in S, \texttt{C}\in S, \texttt{U}\in S, \texttt{G}\in S \\ \textrm{Recursive Step: } & \textrm{If } s \in S\textrm{ and }b \in B \textrm{, then }sb \in S \end{array}\] where \(sb\) is string concatenation.

Pro-tip: informal definitions sometime use \(\cdots\) to indicate “continue the pattern”. Often, to make this pattern precise we use recursive definitions.

Name Domain Codomain Rule Example
\(rnalen\) \(S\) \(\mathbb{Z}^+\) \[\begin{align*} &\textrm{Basis Step:} \\ &\textrm{If } b \in B\textrm{ then } \textit{rnalen}(b) = 1 \\ &\textrm{Recursive Step:}\\ &\textrm{If } s \in S\textrm{ and } b \in B\textrm{, then }\\ &\textit{rnalen}(sb) = 1 + \textit{rnalen}(s) \end{align*}\] \[\begin{align*} rnalen(\texttt{A}\texttt{C}) &\overset{\text{rec step}}{=} 1 +rnalen(\texttt{A}) \\ &\overset{\text{basis step}}{=} 1 + 1 = 2 \end{align*}\]
\(basecount\) \(S \times B\) \(\mathbb{N}\) \[\begin{align*} &\textrm{Basis Step:} \\ &\textrm{If } b_1 \in B, b_2 \in B \textrm{ then} \\ &basecount(~(b_1, b_2)~) = \\ &\begin{cases} 1 & \textrm{when } b_1 = b_2 \\ 0 & \textrm{when } b_1 \neq b_2 \\ \end{cases}\\ &\textrm{Recursive Step:}\\ &\textrm{If } s \in S, b_1 \in B, b_2 \in B\\ &basecount(~(sb_1, b_2)~) = \\ &\begin{cases} 1 + \textit{basecount}(~(s, b_2)~) & \textrm{when } b_1 = b_2 \\ \textit{basecount}(~(s, b_2)~) & \textrm{when } b_1 \neq b_2 \\ \end{cases} \end{align*}\] \[\begin{align*} basecount(~(\texttt{A}\texttt{C}\texttt{U}, \texttt{C})~) = \end{align*}\]
\(2\) to the power of” \(\mathbb{N}\) \(\mathbb{N}\) \[\begin{align*} &\textrm{Basis Step:} \\ &2^0= 1 \\ &\textrm{Recursive Step:}\\ &\textrm{If } n \in \mathbb{N}, 2^{n+1} = \phantom{2 \cdot 2^n} \end{align*}\]
\(b\) to the power of \(i\) \(\mathbb{Z}^+ \times \mathbb{N}\) \(\mathbb{N}\) \[\begin{align*} &\textrm{Basis Step:} \\ &b^0 = 1 \\ &\textrm{Recursive Step:}\\ &\textrm{If } i \in \mathbb{N}, b^{i+1} = b \cdot b^i \end{align*}\]

Integer division and remainders (aka The Division Algorithm) Let \(n\) be an integer and \(d\) a positive integer. There are unique integers \(q\) and \(r\), with \(0 \leq r < d\), such that \(n = dq + r\). In this case, \(d\) is called the divisor, \(n\) is called the dividend, \(q\) is called the quotient, and \(r\) is called the remainder.

Because these numbers are guaranteed to exist, the following functions are well-defined:

\(\textbf{ div } : \mathbb{Z} \times \mathbb{Z}^+ \to \mathbb{Z}\) given by \(\textbf{ div } ( ~(n,d)~)\) is the quotient when \(n\) is the dividend and \(d\) is the divisor.

\(\textbf{ mod } : \mathbb{Z} \times \mathbb{Z}^+ \to \mathbb{Z}\) given by \(\textbf{ mod } ( ~(n,d)~)\) is the remainder when \(n\) is the dividend and \(d\) is the divisor.

Because these functions are so important, we sometimes use the notation \(n \textbf{ div } d = \textbf{ div } ( ~(n,d)~)\) and \(n \textbf{ mod } d = \textbf{ mod } (~(n,d)~)\).

Pro-tip: The functions \(\textbf{ div }\) and \(\textbf{ mod }\) are similar to (but not exactly the same as) the operators \(/\) and \(\%\) in Java and python.

Example calculations:

\(20 \textbf{ div } 4\)

\(20 \textbf{ mod } 4\)

\(20 \textbf{ div } 3\)

\(20 \textbf{ mod } 3\)

\(-20 \textbf{ div } 3\)

\(-20 \textbf{ mod } 3\)

Week 2 Wednesday: Representing numbers

Modeling uses data-types that are encoded in a computer. The details of the encoding impact the efficiency of algorithms we use to understand the systems we are modeling and the impacts of these algorithms on the people using the systems. Case study: how to encode numbers?

Definition For \(b\) an integer greater than \(1\) and \(n\) a positive integer, the base \(b\) expansion of \(n\) is \[(a_{k-1} \cdots a_1 a_0)_b\] where \(k\) is a positive integer, \(a_0, a_1, \ldots, a_{k-1}\) are (symbols for) nonnegative integers less than \(b\), \(a_{k-1} \neq 0\), and \[n = \sum_{i=0}^{k-1} a_{i} b^{i}\]

Notice: The base \(b\) expansion of a positive integer \(n\) is a string over the alphabet \(\{x \in \mathbb{N} \mid x < b\}\) whose leftmost character is nonzero.

Base \(b\) Collection of possible coefficients in base \(b\) expansion of a positive integer
Binary (\(b=2\)) \(\{0,1\}\)
Ternary (\(b=3\)) \(\{0,1, 2\}\)
Octal (\(b=8\)) \(\{0,1, 2, 3, 4, 5, 6, 7\}\)
Decimal (\(b=10\)) \(\{0,1, 2, 3, 4, 5, 6, 7, 8, 9\}\)
Hexadecimal (\(b=16\)) \(\{0,1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F\}\)
letter coefficient symbols represent numerical values \((A)_{16} = (10)_{10}\)
\((B)_{16} = (11)_{10} ~~(C)_{16} = (12)_{10} ~~ (D)_{16} = (13)_{10} ~~ (E)_{16} = (14)_{10} ~~ (F)_{16} = (15)_{10}\)

Examples:

\((1401)_{2}\)

\((1401)_{10}\)

\((1401)_{16}\)

Algorithms can be expressed in English or in more formalized descriptions like pseudocode or fully executable programs.

Sometimes, we can define algorithms whose output matches the rule for a function we already care about. Consider the (integer) logarithm function \[logb : \{b \in \mathbb{Z} \mid b >1 \} \times \mathbb{Z}^+ ~~\to~~ \mathbb{N}\] defined by \[logb (~ (b,n)~) = \text{greatest integer } y \text{ so that } b^y \text{ is less than or equal to } n\]

procedure \(logb\)(\(b\),\(n\): positive integers with \(b > 1\)) \(i\) := \(0\) while \(n\) > \(b-1\) \(i\) := \(i + 1\) \(n\) := \(n\) div \(b\) return \(i\) \(\{ i\) holds the integer part of the base \(b\) logarithm of \(n\}\)

Trace this algorithm with inputs \(b=3\) and \(n=17\)

\(b\) \(n\) \(i\) \(n > b-1\)?
Initial value  \(3\)  \(17\)
After 1 iteration
After 2 iterations
After 3 iterations

Compare: does the output match the rule for the (integer) logarithm function?

Two algorithms for constructing base \(b\) expansion from decimal representation

Most significant first: Start with left-most coefficient of expansion (highest value)

Informally: Build up to the value we need to represent in “greedy” approach, using units determined by base.

procedure \(\textit{basebmost}\)(\(n, b\): positive integers with \(b > 1\)) \(v\) := \(n\) \(k\) := \(1 +\) output of \(logb\) algorithm with inputs \(b\) and \(n\) for \(i\) := \(1\) to \(k\) \(a_{k-i}\) := \(0\) while \(v \geq b^{k-i}\) \(a_{k-i}\) := \(a_{k-i} + 1\) \(v\) := \(v - b^{k-i}\) return \((a_{k-1}, \ldots, a_0) \{(a_{k-1} \ldots a_0)_b~\textrm{ is the base } b \textrm{ expansion of } n \}\)

Least significant first: Start with right-most coefficient of expansion (lowest value)

Idea: (when \(k > 1\)) \[\begin{align*} n &= a_{k-1} b^{k-1} + \cdots + a_1 b + a_0 \\ &= b ( a_{k-1} b^{k-2} + \cdots + a_1) + a_0 \end{align*}\] so \(a_0 = n \textbf{ mod } b\) and \(a_{k-1} b^{k-2} + \cdots + a_1 = n \textbf{ div } b\).

procedure \(\textit{basebleast}\)(\(n, b\): positive integers with \(b > 1\)) \(k\) := \(0\) \(q\) := \(n\) while \(q \neq 0\) \(a_{k}\) := \(q\) mod \(b\) \(k\) := \(k+1\) \(q\) := \(q\) div \(b\) return \((a_{k-1}, \ldots, a_0) \{(a_{k-1} \ldots a_0)_b~\textrm{ is the base } b \textrm{ expansion of } n \}\)

Week 2 Friday: Algorithms for numbers

Find and fix any and all mistakes with the following:

Practice: write an algorithm for converting from base \(b_1\) expansion to base \(b_2\) expansion:

Definition For \(b\) an integer greater than \(1\), \(w\) a positive integer, and \(n\) a nonnegative integer \(\underline{\phantom{\hspace{1in}}}\),   the base \(b\) fixed-width \(w\) expansion of \(n\) is \[(a_{w-1} \cdots a_1 a_0)_{b,w}\] where \(a_0, a_1, \ldots, a_{w-1}\) are nonnegative integers less than \(b\) and \[n = \sum_{i=0}^{w-1} a_{i} b^{i}\]

Decimal Binary Binary fixed-width \(10\) Binary fixed-width \(7\) Binary fixed-width \(4\)
\(b=10\) \(b=2\) \(b=2\), \(w = 10\) \(b=2\), \(w = 7\) \(b=2\), \(w = 4\)
\((20)_{10}\)

Definition For \(b\) an integer greater than \(1\), \(w\) a positive integer, \(w'\) a positive integer, and \(x\) a real number the base \(b\) fixed-width expansion of \(x\) with integer part width \(w\) and fractional part width \(w'\) is \((a_{w-1} \cdots a_1 a_0 . c_{1} \cdots c_{w'})_{b,w,w'}\) where \(a_0, a_1, \ldots, a_{w-1}, c_1, \ldots, c_{w'}\) are nonnegative integers less than \(b\) and \[x \geq \sum_{i=0}^{w-1} a_{i} b^{i} + \sum_{j=1}^{w'} c_{j} b^{-j} \hfill \textrm{\qquad and \qquad} \hfill x < \sum_{i=0}^{w-1} a_{i} b^{i} + \sum_{j=1}^{w'} c_{j} b^{-j} + b^{-w'}\]

\(3.75\) in fixed-width binary,
integer part width \(2\),
fractional part width \(8\)
\(0.1\) in fixed-width binary,
integer part width \(2\),
fractional part width \(8\)

image

Note: Java uses floating point, not fixed width representation, but similar rounding errors appear in both.

Representing negative integers in binary: Fix a positive integer width for the representation \(w\), \(w >1\).

To represent a positive integer \(n\) To represent a negative integer \(-n\)
\([ 0a_{w-2} \cdots a_0]_{s,w}\), where \(n = (a_{w-2} \cdots a_0)_{2,w-1}\) \([1a_{w-2} \cdots a_0]_{s,w}\) , where \(n = (a_{w-2} \cdots a_0)_{2,w-1}\)
Example \(n=17\), \(w=7\): Example \(-n=-17\), \(w=7\):
\([0a_{w-2} \cdots a_0]_{2c,w}\), where \(n = (a_{w-2} \cdots a_0)_{2,w-1}\) \([1a_{w-2} \cdots a_0]_{2c,w}\), where \(2^{w-1} - n = (a_{w-2} \cdots a_0)_{2,w-1}\)
Example \(n=17\), \(w=7\): Example \(-n=-17\), \(w=7\):

For positive integer \(n\), to represent \(-n\) in 2s complement with width \(w\),

Challenge: use definitions to explain why each of these approaches works.

Representing \(0\):

So far, we have representations for positive and negative integers. What about \(0\)?

To represent a non-negative integer \(n\) To represent a non-positive integer \(-n\)
\([ 0a_{w-2} \cdots a_0]_{s,w}\), where \(n = (a_{w-2} \cdots a_0)_{2,w-1}\) \([1a_{w-2} \cdots a_0]_{s,w}\) , where \(n = (a_{w-2} \cdots a_0)_{2,w-1}\)
Example \(n=0\), \(w=7\): Example \(-n=0\), \(w=7\):
\([0a_{w-2} \cdots a_0]_{2c,w}\), where \(n = (a_{w-2} \cdots a_0)_{2,w-1}\) \([1a_{w-2} \cdots a_0]_{2c,w}\), where \(2^{w-1} - n = (a_{w-2} \cdots a_0)_{2,w-1}\)
Example \(n=0\), \(w=7\): Example \(-n=0\), \(w=7\):