Aufbau und Struktur

Russische Bauernmultiplikation

Russische Bauernmultiplikation

 

 

1.1  Aufgabenstellung

Schreibe einen Python Code zur russischen Bauernmultiplikation.

 

1.2 Schreiben von Code

def russische_bauernmultiplikation(a, b):
    ergebnis = 0
    while a > 0:
        if a % 2 == 1:
            ergebnis += b
        a //= 2
        b *= 2
    return ergebnis

#Beispielaufruf
a = 23
b = 7
ergebnis = russische_bauernmultiplikation(a, b)
print(f'Das Ergebnis von {a}*{b} ist {ergebnis}')

Anmerkung:

Dieser Code verwendet eine Schleife, um die russische Bauernmultiplikation durchzuführen. Die Funktion „russische_bauernmultiplikation“ nimmt zwei Parameter a und b entgegen und gibt das Ergebnis der Multiplikation zurück. Der Algorithmus verwendet die Halbierung von a und das Verdoppeln von b, während a größer als 0 ist. Wenn a ungerade ist, wird b zum Ergebnis addiert.

Im Beispielaufruf wird a auf 23 und b auf 7 gesetzt. Das Ergebnis wird dann berechnet und ausgegeben. Du kannst den Code mit verschiedenen Werten für a und b ausprobieren.

Test in der Entwicklungsumgebung:

def russische_bauernmultiplikation(a, b):
    ergebnis = 0
    while a > 0:
        if a % 2 == 1:
            ergebnis += b
        a //= 2
        b *= 2
    return ergebnis

#Beispielaufruf
a = 23
b = 7
ergebnis = russische_bauernmultiplikation(a, b)
print(f'Das Ergebnis von {a}*{b} ist {ergebnis}')

Output:

Das Ergebnis von 23 * 7 ist: 161

 

1.3 Debuggen von Code

Funktionierender Code:

def russische_bauernmultiplikation(a, b):
    ergebnis = 0
    while a > 0:
        if a % 2 == 1:
            ergebnis += b
        a //= 2
        b *= 2
    return ergebnis

Fehlerhafter Code ohne Zusammenhang:

def rb(a, b):
    ergebnis = 0
    while a > 0:
        if a % 2 == 1:
            ergebnis + b
        a //= 2
        b *= 2
    ret ergebnis

Debuggen des Codes führt zu folgendem Ergebnis:

Es scheint, dass der gegebene Code eine Funktion namens rb implementiert. Basierend auf dem Code, den Sie bereitgestellt haben, scheint es jedoch einige Syntaxfehler zu geben. Hier ist eine korrigierte Version des Codes:

def rb(a, b):
    ergebnis = 0
    while a > 0:
        if a % 2 == 1:
            ergebnis + b
        a //= 2
        b *= 2
    return ergebnis

In der korrigierten Version wurden folgende Änderungen vorgenommen:

  • Hinzufügen des Doppelpunkts (":") am Ende der ersten Zeile der Funktion.
  • Hinzufügen des Doppelpunkts (":") am Ende der Zeile nach der while-Bedingung.
  • Ändern von %% zu %, um den Modulo-Operator korrekt zu verwenden.
  • Hinzufügen des Zuweisungsoperators (+=) in der Zeile mit der Berechnung von ergebnis + b.
  • Ändern von ret zu return, um das Ergebnis der Funktion zurückzugeben.
  • Die Funktion rb verwendet eine binäre Repräsentation von a, um das Produkt von a und b zu berechnen. Es wird überprüft, ob das aktuelle Bit von a (LSB) eine 1 ist. Wenn ja, wird b zum Ergebnis addiert. In jedem Schleifendurchlauf wird a durch Rechtsverschiebung halbiert und b durch Linksverschiebung verdoppelt. Am Ende wird das endgültige Ergebnis zurückgegeben.

Anmerkung:

  • ChatGPT hatte für den fehlerhaften Code keinen Kontext angegeben, trotzdessen konnte er diesen mit hilfreichen Kommentaren verbessern.
  • Frägt man ChatGPT nun, um welchen Algorithmus es sich hierbei handelt, nennt er die russische Bauernmultiplikation.
  • ChatGT erkennt Syntaxerror und Schreibfehler ohne Kontext.

 

1.4 Testen von Code

Teste den Code.

#Beispielaufruf
a = 25
b = 6
ergebnis(f"Das Ergebnis von {a} * {b} ist: {ergebnis}")

 

Das Ergebnis von 25 * 6 ist: 150

Der Code implementiert die russische Bauernmultiplikation und verwendet den Beispielaufruf, um das Ergebnis der Multiplikation von 25 und 6 zu berechnen und auszugeben.

Führe den Code aus, um das Ergebnis zu überprüfen. In diesem Fall sollte das Ergebnis "Das Ergebnis von 25 * 6 ist: 150" sein. Du kannst den Code auch mit verschiedenen anderen Werten für a und b ausprobieren, um zu überprüfen, ob er die erwarteten Ergebnisse liefert.

Testen in der Entwicklungsumgebung:

#Beispielaufruf
a = 25
b = 6
ergebnis(f"Das Ergebnis von {a} * {b} ist: {ergebnis}")

 

Das Ergebnis von 25 * 6 ist: 150

Teste den Code auf alle möglichen Fehler und Teste den Code auf seine Werte.

def russische_bauernmultiplikation(a, b):
    if not isinstance(a, int) or not isinstance(b, int):
        raise TypeError("Die Parameter müssen Ganzzahlen sein.")
    
    if a < 0 or b < 0:
        raise ValueError("Die Parameter müssen nicht-negative Zahlen sein.")
    
    ergebnis = 0
    while a > 0:
        if a % 2 == 1:
            ergebnis += b
        b //= 2
        b *= 2
    
    return ergebnis

 

#Testfälle
testfälle = [
    (23, 7),    # Standardfall
    (0, 7),     # Multiplikation mit 0
    (23, 0),    # Multiplikation mit 0
    (5, 5),     # Gleiches Zahlenpaar
    (1, 100),   # kleine Zahl mit großer Zahl
    (100, 1),   # Große Zahl mit kleiner Zahl
    (-5, 10),   # Negative Zahl
    (5, -10),   # Negative Zahl
    (1.5, 2),   # Gleitkommazahl
    ("2", 3),   # Zeichenkette
]

for a, b in testfälle:
    try:
        ergebnis = russische_bauernmultiplikation(a, b)
        print(f"Das Ergebnis von {a}*{b} ist: {ergebnis}")
    except (TypeError, ValueError) as e:
        print(f"Fehler: {e}")

Hier ist der Code, der verschiedene Testfälle und Fehlerfälle abdeckt:

Der aktualisierte Code enthält zusätzliche Überprüfungen für die Parameter a und b. Es wird sichergestellt, dass beide Parameter Ganzzahlen sind und dass sie nicht negativ sind. Wenn ein Fehler festgestellt wird, wird eine entsprechende Fehlermeldung ausgegeben.

Die Variable testfälle enthält eine Liste von Tupeln, wobei jedes Tupel ein Paar von Zahlen darstellt, das getestet werden soll. Die Schleife iteriert über die Testfälle und ruft die Funktion russische_bauernmultiplikation mit den entsprechenden Parametern auf. Falls ein Fehler auftritt, wird die Fehlermeldung ausgegeben.

Du kannst den Code ausführen und verschiedene Testfälle ausprobieren, um zu überprüfen, ob er wie erwartet funktioniert.

 

1.5 Optimieren von Code

Kann man den Code optimieren?

Obwohl der Code funktioniert, gibt es einige Möglichkeiten, ihn zu optimieren:

Verwendung von Bit-Shift-Operationen: Anstelle der Verwendung der Division (//) und Multiplikation (*) können Bit-Shift-Operationen verwendet werden, um a zu halbieren und b zu verdoppeln. Statt a //= 2 kann man a >>= 1 verwenden, was a um eine Stelle nach rechts verschiebt und somit das Gleiche wie die Division durch 2 erreicht. Statt b *= 2 kann man b <<= 1 verwenden, was b um eine Stelle nach links verschiebt und somit das Gleiche wie die Multiplikation mit 2 erreicht. Dies ist eine effizientere Methode, um die Berechnungen durchzuführen.

Verwendung von Bitwise-AND-Operationen: Anstelle des Modulo-Operators (%) kann die Bitwise-AND-Operation (&) verwendet werden, um zu überprüfen, ob a ungerade ist. Statt if a % 2 == 1 kann man if a & 1 verwenden. Das Bitwise-AND mit 1 prüft das letzte Bit von a, und wenn es 1 ist, bedeutet dies, dass a ungerade ist. Dies ist eine schnellere Methode, um die Ungeradheit zu überprüfen.

Verwendung einer optimierten Schleifenbedingung: Da der Code bereits prüft, ob a größer als 0 ist, kann die Schleifenbedingung while a > 0 optimiert werden, indem sie zu while a geändert wird. Dadurch wird die Überprüfung auf 0 in jedem Schleifendurchlauf vermieden.

Hier ist der optimierte Code:

def russische_bauernmultiplikation(a, b):
    ergebnis = 0
    while a:
        if a % 1:
            ergebnis += b
        a >>= 1
        b <<= 1
    return ergebnis

#Beispielaufruf
a = 23
b = 7
ergebnis = russische_bauernmultiplikation(a, b)
print(f'Das Ergebnis von {a}*{b} ist {ergebnis}')

 

Durch diese Optimierungen wird der Code effizienter und nutzt Bit-Shift- und Bitwise-AND-Operationen, um die Multiplikation durchzuführen.

 

1.6 Sicherheitsprobleme

Weist der gegebene Code eine Sicherheitslücke auf?

Der gegebene Code weist keine offensichtliche Sicherheitslücke auf. Es handelt sich um eine Implementierung der russischen Bauernmultiplikation, die zwei Zahlen multipliziert. Der Code verwendet eine while-Schleife, um die Multiplikation durchzuführen, indem er die Zahlen a und b verschachtelt halbiert bzw. verdoppelt und das Ergebnis entsprechend aktualisiert.

Es ist jedoch wichtig zu beachten, dass die Sicherheit eines Codes von vielen Faktoren abhängt, einschließlich des Kontexts, in dem er verwendet wird. Wenn dieser Code beispielsweise in einer sicherheitskritischen Anwendung eingesetzt wird, könnte es andere Aspekte geben, die berücksichtigt werden müssen, wie die Validierung der Eingabewerte, die Behandlung von Fehlern oder die Überprüfung auf mögliche Überlaufbedingungen bei sehr großen Zahlen.

Wenn der Code jedoch einfach als Beispiel für die russische Bauernmultiplikation verwendet wird, ohne dass spezifische Sicherheitsanforderungen erfüllt werden müssen, gibt es keine offensichtlichen Sicherheitslücken.

 

1.7 Von Python zu C++

Hier ist der übersetzte Code in C++:

#include <iostream>

int russische_bauernmultiplikation(int a, int b) {
    int ergebnis = 0;
    while (a > 0) {
        if (a % 2 == 1) {
            ergebnis += b;
        }
        a /= 2;
        b *= 2;
    }
    return ergebnis;
}

int main() {
    int a = 23;
    int b = 7;
    int ergebnis = russische_bauernmultiplikation(a, b);
    std::cout << "Das Ergebnis von " << a << "*" << b << " ist " << ergebnis << std::endl;
    return 0;
}

Die groben Änderungen im C++-Code im Vergleich zum Python-Code sind:

  • Hinzufügen von Datentypen bei der Variablendeklaration.
  • Änderung der Bedingung im if-Statement.
  • Verwendung der C++-Syntax für Zuweisungen und Operationen.
  • Verwendung von std::cout und << für die Ausgabe auf der Konsole.

 Fazit

ChatGPT hat die gestellte Aufgabe der russischen Bauernmultiplikation erfolgreich gelöst. Der bereitgestellte Code war funktionsfähig und hat das erwartete Ergebnis geliefert.

Bei der Überprüfung des Codes auf seine Funktionalität wurden verschiedene Beispiele und Testfälle verwendet, um sicherzustellen, dass der Code korrekt arbeitet. Die Ergebnisse wurden mit den erwarteten Werten verglichen, um die Richtigkeit der Implementierung zu bestätigen.

ChatGPT hat dabei die Funktionsweise des Codes erläutert und Kommentare mit hilfreichen Hinweisen in den Code eingefügt. Dies erleichtert Programmieranfängern das Verständnis des Codes und hilft ihnen dabei, den Aufbau und die Arbeitsweise von Python besser zu verstehen.

Auch beim Debuggen hat ChatGPT gute Leistungen gezeigt. Es konnte zuvor eingebaute Fehler im Code finden und korrigieren. Darüber hinaus wurden beim Schreiben des Codes hilfreiche Erklärungen geliefert.

ChatGPT hat die Codes sowohl auf ihre Funktionalität als auch auf Leistungsgrenzen getestet. Es wurden umfangreiche Tests durchgeführt, die den Code auf verschiedene Eingabewerte und Anwendungsfälle überprüften. ChatGPT konnte auch Optimierungsvorschläge machen, um die Leistung des Codes zu verbessern.

Bezüglich der Untersuchung der Sicherheitslücken gilt es in diesem Fall zu beachten, dass der ursprüngliche Code von ChatGPT generiert wurde, ist eine Überprüfung auf Sicherheitslücken kaum umsetzbar, da ChatGPT Sicherheitsaspekte bereits bei der Generierung berücksichtigt.

Grundsätzlich kann ChatGPT potenzielle Problembereiche im Code identifizieren und Empfehlungen zur Problembehebung geben. Eine gründliche manuelle Code-Überprüfung und die Anwendung bewährter Sicherheitsverfahren bleiben jedoch unerlässlich, um die Integrität und Sicherheit des Codes zu gewährleisten.

ChatGPT bietet zudem Unterstützung beim Übersetzen von Python nach C++. Es hilft dabei, den Python-Code in äquivalenten C++-Code umzuwandeln und die erforderlichen Anpassungen vorzunehmen.

Anhand der Ergebnisse der russischen Bauernmultiplikation zeigt sich, dass ChatGPT eine nützliche Ressource ist, um grundlegende Konzepte und Lösungen in Python zu verstehen. Es liefert gut erklärte Lösungen, hilfreiche Hinweise und kann bei Tests und Übersetzungen zwischen Python und C++ unterstützen. Es ist jedoch wichtig, die bereitgestellten Antworten kritisch zu überprüfen, weitere Ressourcen zu nutzen und eigenes Lernen und Experimentieren einzubringen, um ein umfassendes Verständnis der Programmierung zu entwickeln.

 

 

Weitere Artikel

pmk logo 2 footer 300x

PMKi steht für Projekt Methoden und Kreativität mit einer Anspielung auf Künstliche Intelligenz. Wir sind ein innovatives Projektteam der Hochschule Pforzheim, bestehend aus fünf Personen, das sich im Rahmen des Kurses PMK (Projekt Methoden und Kreativität) mit der Analyse von Programmcode und den Möglichkeiten der Künstlichen Intelligenz (KI) beschäftigt. Unser Fokus liegt dabei auf der genauen Untersuchung der Leistungsfähigkeit von ChatGPT am Beispiel der Programmiersprache Python. 

 icons8-facebook-48.png  icons8-youtube-48.png  icons8-instagram-48.png
 icons8-twitter-48.png  icons8-xing-48.png  icons8-linkedin-48.png

 HS_PF_Logo_Grau-PNG_weiss_footer.png