<div style="text-align: right">
316507, 309995, 300862, 298154, 300245<br>
Group 43
</div>
# Exercises 1
## Problem 1: Introduction to Concurrency
### Question 1
Yes, the two properties hold in a sequential environment.
### Question 2
If we have multiple threads acting on the same `from` account, his final sold could be negative. The amount of money in the bank will stay constant.
Indeed, if for example, `thread 1` checks the balance, then `thread 2` checks the balance, then they both take off the money. It could be that the `from` account does not have enough money for both transfers, but the threads both already entered the `if`.
### Question 3
**Variant 1**
* **Property 1:** Does not hold
* **Property 2:** Holds
* **Deadlock:** Not vulnerable
**Variant 2**
* **Property 1:** Holds
* **Property 2:** Holds
* **Deadlock:** Vulnerable
**Variant 3**
* **Property 1:** Holds
* **Property 2:** Holds
* **Deadlock:** Not vulnerable
## Problem 2: Parallel Reductions
### Question 1
**Sequential version**
```scala=
import scala.math._
def minMax(a: Array[Int]): (Int, Int) =
if (a.size == 0)
throw new IllegalArgumentException
if (a.size== 1)
(a.head, a.head)
else
val b = minMax(a.tail)
(min(a.head, b._1), max(a.head, b._2))
minMax(Array(1, 99, -36, 4)
```
**Parallel version**
```scala=
val maxDepth = 8; // limits number of threads
val threshold = 2; // don't create new task under a certain threshold
def minMaxPar(a: Array[Int], from: Int, to: Int, depth: Int): (Int, Int) =
if (depth > maxDepth || to - from < threshold)
minMax(a: Array[Int], from, to)
else
val mid = floor((from - to)/2)
val result = parallel(minMaxPar(a,from, mid, depth + 1),
minMaxPar(a, mid, to, depth + 1))
(min(result._1, result._1), max(result._2, result._2))
```
### Question 2
```scala=
def minMax(a: Array[Int]): (Int, Int) =
(a.reduce((x, y) => min(x,y)), a.reduce((x, y) => max(x, y)))
```
### Question 3
`f` needs to be be associative, that is, we want to showm that
$$\max(a,\max(b, c))\iff\max(\max(a,b),c),\ \forall\ a,b,c\in \mathbf{Z}$$
We procede by proving 6 subcases:
* $a\leq b\leq c$
* $\max(a, \max(b, c)) = \max(a, c) = c$
* $\max(\max(a, b), c) = \max(b, c) = c$
* $a\leq c\leq b$
* $\max(a, \max(b, c)) = \max(a, b) = b$
* $\max(\max(a, b), c) = \max(b, c) = b$
* $b\leq c\leq a$
* $\max(a, \max(b, c)) = \max(a, b) = a$
* $\max(\max(a, b), c) = \max(a, c) = a$
* $b\leq a\leq c$
* $\max(a, \max(b, c)) = \max(a, c) = c$
* $\max(\max(a, b), c) = \max(a, c) = c$
* $c\leq b\leq a$
* $\max(a, \max(b, c)) = \max(a, b) = a$
* $\max(\max(a, b), c) = \max(a, c) = a$
* $c\leq a\leq b$
* $\max(a, \max(b, c)) = \max(a, b) = b$
* $\max(\max(a, b), c) = \max(b, c) = b$
Because all triplets $(a,b,c)$ belong to one of those cases, we proved that the $\max$ function is associative for any $(a,b,c)\in \mathbf{Z}$.
We can easily develop a similar reasoning for the $\min$ function.