Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Andere Softwarepakete » Polynomdivision und Multiplikation umsetzen
Autor
Universität/Hochschule J Polynomdivision und Multiplikation umsetzen
juergenX
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.07.2019
Mitteilungen: 946
  Themenstart: 2020-12-20

Hi! Kann jemand ein einfaches Programm schreiben oder eine Idee geben wie man Polynomdivision und Multiplikation in Q[X] oder Z{X] in eine beliebige Programmiersprache umsetzen kann, oder hat das schon mal gemacht? Mit GGT Berechnung. Ich meine nicht ein CAS wie Maple, sondern eher C, PHP, Pascal oder Pari? Eine 3rd generation language. Danke jeden Tip! Auch für dem euklidischen Algorithmus verwendbar. man kann evtl. den Pseudocode aus https://de.wikipedia.org/wiki/Euklidischer_Algorithmus als Vorlage nehmen. EUCLID_OLD(a,b) \sourceon txt 1 wenn a = 0 dann 3 Ergebnis = b 4 sonst 5 solange b ≠ 0 6 wenn a > b dann 8 a ← a- b 9 sonst 10 b ← b - a 11 // 12 // 13 Ergebnis = a 14 // \sourceoff


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 3300
  Beitrag No.1, eingetragen 2020-12-21

Polynommultiplikation und -division lassen sich mit dem bekannten Schulbuchalgorithmus implementieren. Für die ggT-Berechnung sollte man wenn möglich die Operatoren für Ganzzahldivision bzw. Divisionsrest überladen. Dann kann man den euklidischen Algorithmus und ähnliches ohne weitere Modifikation verwenden. Hier ein Ausschnitt aus einer Quick-and-Dirty-Implementierung in Python: \sourceon Python class Polynom(): def __init__(self,lst=[]): self.coeff = lst def __getitem__(self,idx): return self.coeff[idx] def __str__(self): # ... def __repr__(self): return str(self) def __len__(self): return len(self.coeff) def __neg__(self): return Polynom([-c for c in self.coeff]) def __add__(self,B): if len(B) > len(self): return B + self C = [c for c in self.coeff] for i in range(len(B)): C[i] += B[i] while C and 0==C[-1]: C = C[:-1] return Polynom(C) def __sub__(self,B): return self + (-B) def __mul__(self,B): C = [0] * (len(self) + len(B)) for i in range(len(self)): for j in range(len(B)): C[i+j] += self[i] * B[j] return Polynom(C) def __floordiv__(self,B): Q = Polynom([]) R = Polynom([c for c in self.coeff]) while len(R)>=len(B): e = len(R)-len(B) M = Polynom([0]*e + [R[-1]/B[-1]]) Q += M R -= M*B return Q def __mod__(self,B): Q = Polynom([]) R = Polynom([c for c in self.coeff]) while len(R)>=len(B): e = len(R)-len(B) M = Polynom([0]*e + [R[-1]/B[-1]]) Q += M R -= M*B return R def gcd(A,B): if not B: return A return gcd(B,A%B) >>> A = Polynom([-3,2,1]) >>> B = Polynom([3,1]) >>> C = Polynom([-1,1])*Polynom([2,2])*Polynom([1,4,1]) >>> A 1x^2 + 2x - 3 >>> B 1x + 3 >>> C 2x^4 + 8x^3 - 8x - 2 >>> gcd(A,C) 8.0x - 8.0 >>> gcd(B,C) - 32.0 >>> gcd(A,B) 1x + 3 \sourceoff


   Profil
ThomasRichard
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 08.04.2010
Mitteilungen: 476
Wohnort: Aachen
  Beitrag No.2, eingetragen 2020-12-21

Hallo Jürgen, klar geht das, aber wozu der Aufwand? Zu Studentenzeiten hatte ich mal an einer effizienten C-Implementierung von Kreisteilungspolynomen versucht (aus Interesse, nicht als Übungsaufgabe). Es wurde ein Riesenprojekt, fraß immer mehr Freizeit, und war auch nicht schneller als Maple. Pari ist übrigens in deiner Aufzählung ein Sonderfall, denn es bietet ja schon Polynomarithmetik inkl. Division und ggT. Es ist auch keine universelle Programmiersprache. [Die Antwort wurde vor Beitrag No.1 begonnen.]


   Profil
juergenX
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.07.2019
Mitteilungen: 946
  Beitrag No.3, vom Themenstarter, eingetragen 2020-12-22

Ja Danke für die python implementation! Dass das bei Pari schon drin ist, wusste ich nicht. Eine Programmierung erscheint mir nützlich, da man (ich.. und nicht nur ich) sehr schnell verrechnet. Finde ggt und Qouotient mit Rest $X^5-4x^4+5x^3-2x+9 \div x^3+3x^2-8$ Eben noch dazu die nächtliche Idee: asoziiere Polynome aus $Z_{10}[X]$ wie $X^5-4x^4+5x^3-2x+9$ bzw. $x^3+3x^2-8$ mit positiven Integers hier $165089 \div 1302$. Habe das eben noch nicht zu Ende gerechnet..so käme man weg von Polynomen zu Zahlenrechnungen. wenn diesr Ersatz ein bijektiver Homomorphismus ist. einfacheres Beispiel $x^2+2x+1 \div x+1 = x+1$ bzw. $121 \div 11 = 11$


   Profil
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 4955
Wohnort: Harz
  Beitrag No.4, eingetragen 2020-12-23

Ich hätt da dieses zu bieten... (ist sozusagen ein rudiment): \sourceon python import numpy as np from fractions import Fraction as frac # (X5−4x4+5x3−2x+9)/(x3+3x2−8) test gg poly_1 = [9,-2,0,5,-4,1] poly_2 = [-8,0,3,1] def div_rest(myPoly_1,myPoly_2): for move in range(len(myPoly_1)-len(myPoly_2),-1,-1): faktor=frac(myPoly_1[len(myPoly_2)+move-1] ,myPoly_2[len(myPoly_2)-1]) for stelle in range(len(myPoly_2)): myPoly_1[stelle+move]-=myPoly_2[stelle]*faktor rest=[] for loop in range(len(myPoly_2)-1): rest.append(myPoly_1[loop]) while len(rest)>1 and rest[len(rest)-1]==0: rest.pop() return rest def ggT(myPoly_1,myPoly_2): rest = div_rest(myPoly_1,myPoly_2) if len(rest)<2: if rest[0]==0: return myPoly_2 else: return 1 else: return ggT(myPoly_2,rest) print("Polynome :",str(poly_1)," vs. ",str(poly_2)) if len(poly_1)>len(poly_2): print("ggT=",ggT(poly_1,poly_2)) else: print("ggT=",ggT(poly_2,poly_1)) \sourceoff


   Profil
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27787
Wohnort: Hessen
  Beitrag No.5, eingetragen 2020-12-23

\(\begingroup\)\(\newcommand\d{\mathop{}\!\mathrm{d}}\) \quoteon(2020-12-22 18:57 - juergenX in Beitrag No. 3) $X^5-4x^4+5x^3-2x+9 \div x^3+3x^2-8$ einfacheres Beispiel $x^2+2x+1 \div x+1 = x+1$ bzw. $121 \div 11 = 11$ \quoteoff Du solltest dir angewöhnen, ordentlich Klammern zu verwenden. Denn $a+b\div c+d$ ist gänzlich etwas Anderes als $(a+b)\div(c+d)$. Das Erste ist $a+\frac{b}{c}+d$, hingegen das Zweite $\frac{a+b}{c+d}$.\(\endgroup\)


   Profil
thureduehrsen
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 13.11.2007
Mitteilungen: 1780
Wohnort: Kiel, Deutschland
  Beitrag No.6, eingetragen 2020-12-24

\(\begingroup\)\(\newcommand{\id}{\operatorname{id}}\) Hallo juergenX, \quoteon(2020-12-20 19:20 - juergenX im Themenstart) Polynomdivision und Multiplikation in Q[X] oder Z{X] \quoteoff habe ich zufällig auf Platte rumliegen, mit Ansätzen für \(\mathbb Q[X]\). Siehe hier (tar-Archiv einer Sammlung von Java-Klassen). Copyright 2002-2020, Robert Sedgewick and Kevin Wayne (GNU GPL); meine eigenen Ansätze stammen aus den Jahren 2010 bis 2018. Du kannst dich also nach Lektüre des Codes an der Implementierung des ggT versuchen. Frohe Festtage! mfg thureduehrsen \(\endgroup\)


   Profil
juergenX
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.07.2019
Mitteilungen: 946
  Beitrag No.7, vom Themenstarter, eingetragen 2020-12-29

\quoteon(2020-12-23 23:29 - viertel in Beitrag No. 5) \quoteon(2020-12-22 18:57 - juergenX in Beitrag No. 3) $X^5-4x^4+5x^3-2x+9 \div x^3+3x^2-8$ einfacheres Beispiel $x^2+2x+1 \div x+1 = x+1$ bzw. $121 \div 11 = 11$ \quoteoff Du solltest dir angewöhnen, ordentlich Klammern zu verwenden. Denn $a+b\div c+d$ ist gänzlich etwas Anderes als $(a+b)\div(c+d)$. Das Erste ist $a+\frac{b}{c}+d$, hingegen das Zweite $\frac{a+b}{c+d}$. \quoteoff Ja so ist es richtig: $\displaystyle \large \frac {X^5-4x^4+5x^3-2x+9}{x^3+3x^2-8}$ Ich habe gerade zurück aus Weihnachts"urlaub" noch nicht die Idee des Ersetzens der Polynome aus $\displaystyle \large Z[X] \Leftrightarrow \mathbb Q_{+}$ weiterverfolgt, finde das aber eine interessante Idee:) J


   Profil
juergenX
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 08.07.2019
Mitteilungen: 946
  Beitrag No.8, vom Themenstarter, eingetragen 2020-12-29

\quoteon(2020-12-24 11:16 - thureduehrsen in Beitrag No. 6) Hallo juergenX, \quoteon(2020-12-20 19:20 - juergenX im Themenstart) Polynomdivision und Multiplikation in Q[X] oder Z{X] \quoteoff Siehe hier (tar-Archiv einer Sammlung von Java-Klassen). Frohe Festtage! mfg thureduehrsen \quoteoff Ja Danke Ich habe gerade zurück aus Familien Weihnachtserholung Deinen Post gelesen und das .tar entpackt. Früher hatte ich mal mit Java unter eclipse gearbeitet. siehe https://www.eclipse.org/downloads/packages/release/kepler/sr1/eclipse-ide-java-developers Sogar eine Primzahlzerlegung beliebiger Integer etwas abgewandelt. Modifiziert aus https://www.alpertron.com.ar/ECM.HTM Es lohnt sich sicher, mal wieder daran/damit zu arbeiten. J.


   Profil
juergenX hat die Antworten auf ihre/seine Frage gesehen.
juergenX hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]