# Psychology 9040a: Scientific Computing with MATLAB

## Table of Contents

- Practice Assignment #1 (practice 1)
- Project Euler Problem 1 (pe001)
- Project Euler Problem 2 (pe002)
- Project Euler Problem 6 (pe006)
- Advent of Code 2015 Day 1 (aoc201501)
- FizzBuzz (FizzBuzz)
- Primes (Primes)
- Project Euler Problem 7 (pe007)
- Advent of Code 2015 Day 2 (aoc201502)
- Advent of Code 2015 Day 4 (aoc201504)
- Project Euler Problem 59 (pe059)

## Practice Assignment #1 (practice 1)

You can use the `input()`

function in MATLAB to query the user for
input. You can use the `disp()`

or `fprintf()`

function in MATLAB to
display output to the screen.

sample solution: practice1.m

## Project Euler Problem 1 (pe001)

Create a variable to keep track of a running total. Initialize its
value to zero. Then use a *for loop* to go through all integers up to
some limit, and for each one, use an *if statement* to test whether
each integer is divisible by 3 or by 5 with zero remainder. You can
use the `mod()`

function in MATLAB to find the remainder after
division.

sample solution: pe001.m

## Project Euler Problem 6 (pe006)

You can use a *for loop* to solve this challenge. Use two variables to
keep track of the sum of squares, and the squared sum. After the *for
loop* is done, compute the difference between those two variables.

sample solution: pe006.m

## Advent of Code 2015 Day 1 (aoc201501)

You can use the MATLAB function called `fileread()`

to read in the
puzzle input into an array of characters:

>> p = fileread('puzzle_input.txt'); >> p(1:10) ans = '()(((()))('

sample solution: aoc201501.m

## FizzBuzz (FizzBuzz)

Use the `mod()`

function in MATLAB to find the remainder after
division. Use a *for loop* to run through each number up to some
maximum. Use an *if statement* to test each number. You can use the
`fprintf()`

or `disp()`

function in MATLAB to print things to the
screen.

sample solution: fizzbuzz.m

## Primes (Primes)

A simple brute force method might be to use a *for loop* to test
whether the candidate number is divisible with zero remainder by
numbers starting from 2 up to the candidate number minus 1. If in no
case is the answer "yes" then the number must be prime. You can use
the `mod()`

function in MATLAB to find the remainder after division.

There are various efficiencies you can implement to make your script run faster. Here are some hints. Do you always need to test all numbers between 2 and the candidate subtract one? Are even numbers ever prime? Do you need to run through every number between 2 and the candidate number minus one, or can you stop before that?

sample solution: primes.m

## Project Euler Problem 7 (pe007)

Use a variable that you initialize before a *for loop* to keep track
of how many primes you've found so far.

sample solution: pe007.m

## Advent of Code 2015 Day 2 (aoc201502)

You can use the `importdata()`

function in MATLAB to load the data file
into memory:

boxes = importdata('ac201502_input.txt');

You can use the MATLAB function `split()`

to split a string into
consituent parts, given a separator character. You can use the
`str2num()`

function in MATLAB to convert a string into a number:

a_box = boxes{i}; sides = split(a_box, 'x'); l = str2num(sides{1}); w = str2num(sides{2}); h = str2num(sides{3});

You can use the `min()`

function in MATLAB to find the minimum value
of an array. You can use the `sort()`

function in MATLAB to sort
values in an array.

sample solution: aoc201502.m

## Advent of Code 2015 Day 4 (aoc201504)

Here is a MATLAB function you can use to perform MD5 hashing. Copy and
paste it into a new file, name it `md5.m`

and then you can use `md5()`

within MATLAB to compute the hash of a string:

function h = md5(s) persistent MD5 if isempty( MD5 ) MD5 = java.security.MessageDigest.getInstance( 'MD5' ); end MD5.update( uint8( s(:) ) ); h = typecast( MD5.digest, 'uint8' ); h = dec2hex( h )'; h = lower( h(:) )'; end

The answer to Part 1, at least for my key (`yzbqklnj`

),
is 282749. Part 2 will take a looong time to run. For my key
(yzbqklnj) the answer is 9962624. On my fast desktop it took about 13
minutes to run the MATLAB code.

sample solution: aoc201504.m

I also wrote a solution in C, compiled it, and it only took 9.8 seconds to run… an illustration of how much faster a compiled language like C can often be, compared to an interpreted language like MATLAB.

There is another MD5 routine you can try, which is roughly 10x faster,
because it's compiled C code: GetMD5. Download it, unzip it, start
MATLAB, navigate to the folder you just unzipped, and run
`InstallMex('GetMD5.c')`

. Then the `GetMD5()`

function will be
available to you.

## Project Euler Problem 59 (pe059)

### bitwise XOR in MATLAB

The MATLAB function `bitxor()`

will perform the XOR operation on bytes
of data. To encrypt a string of characters like `'hello!'`

you can
first convert the character string into 8-bit integer bytes using the
`int8()`

function. Here is a small example of encrypting the character
string `'hello!'`

using the encryption key `'me'`

, repeated 3 times to
match the number of characters of the string to be encrypted:

% encryption plaintext = 'hello!'; key = 'me'; plaintext_bytes = int8(plaintext); key_bytes = int8(key); ciphertext_bytes = bitxor(plaintext_bytes, repmat(key_bytes, 1, 3)); disp(ciphertext_bytes)

Here is an example of decrypting the ciphertext using the (known) key:

% decryption ciphertext_bytes = int8([5,0,1,9,2,68]); key = 'me'; key_bytes = int8(key); plaintext_bytes = bitxor(ciphertext_bytes, repmat(key_bytes, 1, 3)); plaintext = char(plaintext_bytes); disp(plaintext)

### Loading the cipher text

You can use the MATLAB function `load()`

to load the cipher
text. Assuming it's saved in a file called `cipher.txt`

, you can
use code like:

cipher = load('cipher.txt');

sample solution: pe059.m