Skip to content
Snippets Groups Projects
Select Git revision
  • 75b4569c86490b402fb6e7fd7858a8f15abd2869
  • 2025ss default
  • 2024ss
  • 2023ss
  • 2022ss
  • 2021ss
  • 2020ss
  • 2019ss
  • 2018ss
9 results

ad-20240411.txt

Blame
  • ad-20240411.txt 2.84 KiB
    Langzahlarithmetik: Input/Output, 11.04.2024, 13:56:17
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    geg.: lange Zahl zu einer Zweierpotenz-Basis, z.B. 2³²
    Problem: Ausgabe als Dezimalzahl
    
    Lösung für kleine Zahlen:
    Was ist 0xdeadbeef dezimal?
    (= 1101 1110 1010 1101 1011 1110 1110 1111 binär)
    
    binär:
     1 + 2 + 4 + 8 
    
    hexadezimal:
     13 * 16^7 + 14 * 16^6 + ... + 15 * 16^0
    
    --> Dann brauchen wir zusätzlich auch eine Dezimal-Langzahlarithmetik.
        --> Problem gelöst, verbraucht aber zusätzlichen Speicherplatz.
    
    Lösung ohne Umspeichern:
      Zahl % 10 --> dezimale Einerziffer
      Zahl /= 10
      Zahl % 10 --> dezimale Zehnerziffer
      Zahl /= 10
      Zahl % 10 --> dezimale Hunderterziffer
      ...
        --> Problem gelöst, verbraucht aber zusätzliche Rechenzeit.
    
    Verwendung der Basis 2³² hat den Vorteil, daß der Rechner
    dafür Assembler-Befehle kennt.
    
    Binäre Exponentiation, 11.04.2024, 14:10:04
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    x^18 möglichst effizient berechnen:
    
     - 18 binär notieren 10010
    
     - von rechts nach links durchgehen, x jeweils quadrieren
    
       Bit 0 (ganz rechts): 0            x
       Bit 1:               1            x^2
       Bit 2:               0            x^4
       Bit 3:               0            x^8
       Bit 4:               1            x^16
    
     - Dort, wo die Einsen stehen, multiplizieren.
       (Mit 1 anfangen.)
    
                          1 * x^2 * x^16 = x^18
    
    --> Effizienz der binären Exponentiation von x^n: O(_was_ von n?)
        
        O(log n)
    
        Die Schleife geht über die Binärziffern von n (= 18).
        Deren Anzahl ist log_2 (n).
    
     - Zum Vergleich: die Schleife
    
         int e = 1;
         for (int i = 0; i < 18; i++)
           e *= x;
    
       berechnet ebenfalls x^18. Effizienz: O(n)
    
       Die Schleife geht über die Zahl n selbst.
    
    Aufgabe: RSA effizienter [als im Praktikum], 11.04.2024, 14:26:38
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Implementieren Sie RSA wie in Hardwarenahe Programmierung, Praktikumsversuch 1,
    aber: Die Effizienz der Benutzung (Schlüsselerzeugung, Verschlüsseln, Entschlüsseln)
    soll O((log n)^2) sein. [Im HP-Praktikum genügte O(n).]
    
    Hinweis 1: Verwenden Sie
     - den Datentyp uint64_t,
     - binäre Exponentiation für die Ver- und Entschlüsselung,
     - den erweiterten euklidischen Algorithmus für die Schlüsselerzeugung.
    
    Hinweis 2: Es sollte möglich sein, die Primzahlen so groß zu machen, daß ihr
    Produkt den verwendeten Datentyp (uint64_t) _fast_ ausfüllt. Spätestens dann
    sollte der Unterschied in der Rechengeschwindigkeit auch ohne Messung deutlich
    spürbar sein.
    
    Hinweis 3: Es ist weiterhin wichtig, nach jeder Multiplikation mit x
    (einschließlich Quadrieren), modulo zu rechnen.
    
    Vergleichen Sie die Zeitmessungen der alten Variante (O(n)) und der neuen (O(log(n)^2)).
    
    Auch Zwischenergebnisse bereits melden; dann können wir darüber sprechen.
    (Auch Fragen dürfen natürlich gestellt werden.;-)