---
# System prepended metadata

title: Diskrete Mathematik - Lab 1 - Modulares rechnen

---

# Diskrete Mathematik - Lab 1 - Modulares rechnen

* Gruppe Nummer 12: Schupp, Sybille; Pfeiffer, Felix; Bubeck, Jannik

## Laboraufgabe 1

### 1.1 $ggT(24140,16762)$

$24140 = 1 \cdot 16762 + 7378$
$16762 = 2 \cdot 7378 + 2006$
$7378 = 3 \cdot 2006 + 1360$
$2006 = 1 \cdot 1360 + 646$
$1360 = 2 \cdot 646 + 68$
$646 = 9 \cdot 68 + 34$
$68 = 2 \cdot 34 + 0$

$ggT(24140,16762) = 34$

### 1.2 $ggT(4655,12075)$ als Linearkombination

#### ggT mit Euklidischem Algorithmus berechnen

$12075 = 2 \cdot 4655 + 2765$
$4655 = 1 \cdot 2765 + 1890$
$2765 = 1 \cdot 1890 + 875$
$1890 = 2 \cdot 875 + 140$
$875 = 6 \cdot 140 + 35$
$140 = 4 \cdot 35 + 0$

$ggT(4655,12075) = 35$

#### Rückrechnung 

$35 = 875 - 6 \cdot 140 = 875 - 6\cdot (1890 - 2 \cdot 875)$
$~~~~ = -6 \cdot 1890 + 13 \cdot 875 = -6 \cdot 1890 + 13 \cdot (2765 - 1 \cdot 1890)$
$~~~~ = 13 \cdot 2765 - 19 \cdot 1890 = 13 \cdot 2765 - 19 \cdot (4655 - 1 \cdot 2765)$
$~~~~ = -19 \cdot 4655 + 32 \cdot 2765 = -19 \cdot 4655 + 32 \cdot (12075 - 2 \cdot 4655)$
$~~~~ = 32 \cdot 12075 - 83 \cdot 4655$

$ggT(4655,12075) = 35 = 32 \cdot 12075 - 83 \cdot 4655$

### 1.3

**a)** $7 \cdot 4 - 21 \cdot 6 \equiv 2 \cdot 4 + 4 \cdot 1 = 8 + 4 \equiv 3 + 4 = 7 \equiv 2 \mod 5$

**b)** $17 \cdot 5 + 13 \cdot 11 \equiv 8 \cdot 5 + 4 \cdot 2 = 40 + 8 \equiv 4 + 8 = 12 \equiv 3 \mod 9$

**c)** $6 \cdot 14 - 9 \cdot 7 \equiv 6 \cdot 3 - 9 \cdot 7 = 18 - 63 \equiv 7 + 3 = 10 \mod 11$

### 1.4

#### a) $18 \mod 49

##### Schritt 1: ggT(18,49) berechnen

$49 = 2 \cdot 18 + 13$
$18 = 1 \cdot 13 + 5$
$13 = 2 \cdot 5 + 3$
$5 = 1 \cdot 3 + 2$
$3 = 1 \cdot 2 + 1$
$2 = 2 \cdot 1 + 0$

$ggT(18,49) = 1$

##### Schritt 2: Rückrechnung für Vielfachsumme

$1 = 3 - 1 \cdot 2 = 3 - 1 \cdot (5 - 1 \cdot 3)$
$~~= -1 \cdot 5 + 2 \cdot 3 = 1 \cdot 5 + 2 \cdot (13 - 2 \cdot 5)$
$~~= 2 \cdot 13 - 5 \cdot 5 = 2 \cdot 13 - 5 \cdot (13 - 1 \cdot 13)$
$~~= -5 \cdot 18 + 7 \cdot 13 = -5 \cdot 18 + 7 \cdot (49 - 2 \cdot 18)$
$~~= 7 \cdot 49 - 19 \cdot 18$ 

$a=18 ,n=49$
$\alpha = -19, \beta = 7$

##### Schritt 3: Inverse berechnen

$\alpha = -19 < 0$
--> $a' = \alpha + n = -19 + 49 = 30$

#### b) $3 \mod 101$

##### Schritt 1: ggT(3,101) berechnen

$101 = 33 \cdot 3 + 2$
$~~~~~~= 1 \cdot 2 + 1$
$~~~~~~= 2 \cdot 1 + 0$

$ggT(3,101) = 1$

##### Schritt 2: Rückrechnung für Vielfachsumme

$1 = 3 - 1 \cdot 2 = 3 - 1 \cdot (101 - 33 \cdot 3)$
$~~ = -1 \cdot 101 + 34 \cdot 3$

$a= 3, n = 101$
$\alpha = 34, \beta = -1$

##### Schritt 3: Inverse berechnen

$\alpha = 34 > 0$
--> $a' = \alpha = 34$

#### c) $126 \mod 239$

##### Schritt 1: ggT(126,239) berechnen

$239 = 1 \cdot 126 + 113$
$126 = 1 \cdot 113 + 13$
$113 = 8 \cdot 13 + 9$
$13 = 1 \cdot 9 + 4$
$9 = 2 \cdot 4 + 1$
$4 = 4 \cdot 1 + 0$

$ggT(126,239) = 1$

##### Schritt 2: Rückrechnung für Vielfachsumme

$1 = 9 - 2 \cdot 4 = 9 - 2 \cdot (13 - 1 \cdot 9)$
$~~= -2 \cdot 13 + 3 \cdot 9 = -2 \cdot 13 + 3 \cdot (113 - 8 \cdot 13)$
$~~= 3 \cdot 113 - 26 \cdot 113 = 3 \cdot 113 - 26 \cdot (126 - 1 \cdot 13)$
$~~= -26 \cdot 126 + 29 \cdot 113 = 26 \cdot 126 + 29 \cdot (239 -1 \cdot 126)$
$~~=29 \cdot 239 - 55 \cdot 126$

$a = 126, n = 239$
$\alpha = -55, \beta = 29$

##### Schritt 3: Inverse berechnen

$\alpha = -55 < 0$
-->$a' = \alpha + n = -55 + 239 = 184$


## Laboraufgabe 2

### 2.1 Restklassenkonstruktion

#### a,b) Restklassen $Z_4, Z_5, Z_7$

$Z_4$:

![](https://i.imgur.com/kRYcO8i.jpg)

$Z_5$:

![](https://i.imgur.com/MzysyTm.jpg)


$Z_7$:

![](https://i.imgur.com/XETYpcY.jpg)

#### c) Anzahl Restklassen

**Hinweis:** Jede Division ist als Ganzzahldivision zu verstehen.

| $n = 4$ | $[0]_4$ | $[1]_4$ | $[2]_4$ | $[3]_4$ |
| -------- | -------- | -------- | -------- | -------- |
| -10 bis 10     | 5     | 5     | 6     | 5     |
| -20 bis 20     | 11    | 10    | 10    | 10    |
| -z bis z     | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$     | $\frac{z*2}{n} \pm x, x \in \{0,1\}$      |


| $n = 5$ | $[0]_5$ | $[1]_5$ | $[2]_5$ | $[3]_5$ |$[4]_5$ |
| -------- | -------- | -------- | -------- | -------- | - |
| -10 bis 10     | 5     | 4     | 4     | 4     |4
| -20 bis 20     | 9    | 8    | 8    | 8    |8
| -z bis z     | $\frac{z*2}{n} \pm x, x \in \{0,1\}$     | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ |$\frac{z*2}{n} \pm x, x \in \{0,1\}$| $\frac{z*2}{n} \pm x, x \in \{0,1\}$ |

| $n = 7$ | $[0]_7$ | $[1]_7$ | $[2]_7$ | $[3]_7$ | $[4]_7$ | $[5]_7$ | $[6]_7$ 
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | - |
| -10 bis 10| 3     | 3       | 3       | 3       | 3      | 3    | 3
| -20 bis 20  | 5    | 6    | 6        | 6        | 6       | 6     |6
| -z bis z     | $\frac{z*2}{n} \pm x, x \in \{0,1\}$  | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ | $\frac{z*2}{n} \pm x, x \in \{0,1\}$ |

### 2.2 Repräsentantensystem

#### a,b) Repräsentantensystem von $Z_4$

![](https://i.imgur.com/nffK95a.jpg)


#### c) Repräsentantensystem $Z_7$


$\{−23, −6, −3, 2, 7, 10\}$ ist kein Repräsentantensystem von $Z_7$, da es nur 6 Elemente hat, ein Repräsentantensystem von $Z_7$ benötigt aber genau 7 Elemente. $\{-23, -6 -3, 2, 7, 10, 20\}$ wäre ein Repräsentantensystem von $Z_7$.

$\{−16, −9, −2, 5, 12, 19, 26\}$ - Dies ist kein Repräsentantensystem sondern die Restklasse $[5]_7$, da alle Elemente in der Division mit 7, Rest 5 ergeben. Da bereits mehrere Elemente Rest 5 ergeben lässt sich kein gültiges Repräsentantensystem mehr bilden.

#### d) Repräsentantensystem $Z_5$

$\{-1, -2, 2, 6, 10\}$

Nachweis: Wir brauchen Zahlen, die Reste von 0-4 liefern.
    - -1 --> Rest 4
    - -2 --> Rest 3
    - 2 --> Rest 2
    - 6 --> Rest 1
    - 10 --> Rest 0
Das ist bei uns gegeben --> es handelt sich um ein Repräsentantensystem.

#### 2.3 Programm

```Python
from funktionen import inverse

print("Gebe a an:")
a = int(input())
print("Gebe b an:")
b = int(input())
print("Gebe n an:")
n = int(input())
print(f"Teiler: {n}")

z1, z2, z3, z4 = a + b, a - b, a * b, a / b if b != 0 else None
r1, r2, r3, r4 = z1 % n, z2 % n, z3 % n, z4 % n if z4 else None

print(f"a + b = {a + b}, a - b = {a - b}, a * b =  {a * b}" + f", a / b = /
{a / b}" if z4 else "")
restklassen = [[] for x in range(n)]
restklassen[0].append(0)
for x in range(1, 100):
    restklassen[x % n].append(x)
    restklassen[-x % n].append(-x)

for p in range(len(restklassen)):
    restklassen[p].sort()

print(f"Restklasse für a + b mod n = {z1} mod {n} = {r1}: [{','.join(str(x)/
for x in restklassen[r1])}]")
print(f"Restklasse für a - b mod n = {z2} mod {n} = {r2}: [{','.join(str(x)/ 
for x in restklassen[r2])}]")
print(f"Restklasse für a * b mod n = {z3} mod {n} = {r3}: [{','.join(str(x)/ 
for x in restklassen[r3])}]")

inv = inverse(a, n)
r4 = (b*inv) % n
if inv:
    print(f"Restklasse für a / b mod n = a * inv mod n => {b*inv} mod {n} =/
    {r4}: [{','.join(str(x) for x in restklassen[r4])}]")
else:
    print("Restklasse für a/b nicht möglich")```

```

```Python
# funktionen.py
def ggT(z1, z2):
    groessere_Zahl, kleinere_Zahl = z1 if z1 > z2 else z2, z1/
    if z1 < z2 else z2

    b = kleinere_Zahl
    a = groessere_Zahl
    rest = a % b
    while rest != 0:
        a = b
        b = rest
        rest = a % b

    return b


def vielfachsumme(a, b):
    g, k = a if a > b else b, a if a < b else b

    faktor_g1, faktor_k1 = _vielfachsumme_berechnen(g, k)
    faktor_k2, faktor_g2 = _vielfachsumme_berechnen(k, g)

    if faktor_g1 + faktor_k1 < faktor_g2 + faktor_k2:
        return faktor_g1, faktor_k1 * -1
    else:
        return faktor_g2 * -1, faktor_k2


def _vielfachsumme_berechnen(a, b) -> (int, int):
    faktor_a, faktor_b = 1, 1

    while faktor_a * a - faktor_b * b != 1:
        if faktor_a * a - faktor_b * b < 1:
            faktor_a += 1
        else:
            faktor_b += 1
    # print(f"{a}*{faktor_a} - {b}*{faktor_b}")
    # print("Ergebnis: " + str(faktor_a * a - faktor_b * b))
    return faktor_a, faktor_b


def inverse(a, n):
    inverted = n > a
    if inverted:
        a, n = n, a
    ggt = ggT(a, n)

    if ggt != 1:
        return None

    alpha, beta = vielfachsumme(a, n)

    if inverted:
        n, a = a, n
        alpha, beta = beta, alpha
    return alpha % n


if __name__ == "__main__":
    print(inverse(126, 239))  # 184
    print("----")
    print(inverse(3, 101))  # 34
    print("----")
    print(inverse(18, 49))  # 30
```


