In der Gleichung a + bx = c + dy
sind alle Variablen Ganzzahlen. a
, b
, c
und d
sind bekannt. Wie finde ich integrale Lösungen für x
und y
? Wenn ich richtig denke, wird es eine unendliche Anzahl von Lösungen geben, getrennt durch das niedrigste gemeinsame Vielfache von b
und d
, aber alles, was ich brauche, ist eine Lösung, und ich kann den Rest berechnen. Hier ist ein Beispiel:
Im Moment durchlaufe ich ganzzahlige Werte von x
, bis ich einen integralen Wert für y
(Pseudocode) gefunden habe:
Ich habe das Gefühl, dass es einen besseren Weg gibt, dies zu tun. Gibt es eine Möglichkeit, x und y ohne Schleife zu finden? Ich benutze C ++, wenn das von Bedeutung ist.
lineare diophantische Gleichungen haben die Form ax + by = c
. Wenn c
der größte gemeinsame Teiler von a
und b
ist, bedeutet dies a=z'c
und b=z''c
, dann ist dies Bézouts Identität des Formulars
mit a=z'
und b=z''
und die Gleichung hat eine unendliche Anzahl von Lösungen. Statt der Methode der Versuchssuche können Sie überprüfen, wenn c
der größte gemeinsame Teiler (GCD) von a
und b
ist (in Ihrem Fall bedeutet dies bx - dy = c - a
)
Wenn a
und b
ein Vielfaches von c
sind, dann können x
und y
mit berechnet werden erweiterter euklidischer Algorithmus , der die Ganzzahlen x
und y
(von denen eine typischerweise negativ ist) findet, die Bézouts Identität erfüllen
und deine Antwort ist:
a = k*x
,
%Code%,
b = k*y
für jede Ganzzahl k .
(als Randnotiz: dies gilt auch für jede andere euklidische Domäne , dh Polynomring und jede euklidische Domäne ist eindeutige Faktorisierungsdomäne ). Sie können die Iterative Methode verwenden, um diese Lösungen zu finden:
Durch routinemäßige Algebra zum Expandieren und Gruppieren ähnlicher Begriffe (siehe letzten Abschnitt des zuvor erwähnten Wikipedia-Artikels ) Algorithmus für iterative Methode wird erhalten:
Pseudocode:
%Vor% Also habe ich einen Beispielalgorithmus geschrieben, der größten gemeinsamen Teiler mit der c - a = k * gcd(a,b)
und a
berechnet (für negative - diese zusätzlichen Schritte werden benötigt), es gibt GCD zurück und speichert Lösungen für b
und x
in den Variablen, die als Referenz übergeben wurden:
durch Übergeben eines Beispiels aus Wikipedia für y
und a = 120
erhalten wir:
r: 5,3,2,1,0,
q: 5,4,1,1,2,
x: 1,0,1, -4,5, -9,23,
y: 0,1, -5,21, -26,47, -120,
was mit der angegebenen Tabelle für dieses Beispiel übereinstimmt:
Tags und Links math c++ equation-solving equation integer-arithmetic