| Autor |
Beitrag |
FelixD
Hält's aus hier
Beiträge: 14
|
Verfasst: Fr 14.01.11 17:33
Ich habe folgenden Konstrukor gegeben:
C#-Quelltext 1: 2: 3: 4: 5:
| public Poly(ModInt[] coef, int deg) { this.coef=coef; this.deg=deg; } |
Nun möchte ich das Nullpolynom implementieren:
C#-Quelltext 1:
| public static Poly Zero = new Poly(-1,{0}); |
Das Problem ist, das der Input Parameter {0} (wie vermutet) zu einem Fehler führt. Nun möchte ich aber nicht umständlich erst ein Array erstellen und damit dann das Nullpolynom erzeugen. Wie löse ich dieses Problem am elegantesten/effizientesten ??
lg
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.01.11 17:47
Das params Schlüsselwort könnte das vereinfachen. Dann kannst du jeden Wert deinen Array einfach so übergeben als wäre es ein weitere Parameter in deiner Methodensignatur.
Für diesen Beitrag haben gedankt: FelixD
|
|
FelixD 
Hält's aus hier
Beiträge: 14
|
Verfasst: Fr 14.01.11 18:08
Das heißt also ich müsste den Konstruktur umschreiben zu:
C#-Quelltext 1: 2: 3: 4: 5:
| public Poly( int deg,params ModInt[] coef) { this.coef=coef; this.deg=deg; } |
Dann sollte ich wahlweise ein Array als Array oder eben als eine Aufzählung a_1,...,a_n übergeben. Ist das richtig?
Vielen Dank!
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.01.11 18:11
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 14.01.11 18:41
Du könntest auch den Parameter "int deg" entfernen und ihn mittels
C#-Quelltext 1:
| this.deg = coef.Length - 1; |
berechnen lassen.
P.S. Dein erster Code konnte doch gar nicht compilieren, da du doch die Parameter in der falschen Reihenfolge übergeben hattest, oder?
Für diesen Beitrag haben gedankt: FelixD
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Fr 14.01.11 23:28
Wie wär's denn mit Überladung?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public Poly(int deg, ModInt[] coef) { this.deg = deg; this.coef = coef; }
public Poly() { this.deg = 0; this.coef = ModInt[]; } |
Wahlweise auch mit params.
FelixD hat folgendes geschrieben : | | Nun möchte ich aber nicht umständlich erst ein Array erstellen und damit dann das Nullpolynom erzeugen. |
Wenn du die Eigenschaft Zero einmal deklarierst, dann musst du den entsprechenden Aufruf doch nur einmal tätigen. Ist es so schlimm, dann einmal
C#-Quelltext 1:
| public static Poly Zero = new Poly(-1, new ModInt[] { }); |
zu schreiben? Aber Überladung ist natürlich auch möglich.
Edit: Der erste Code enthält einen Fehler, siehe Th69s Post. Danke!
Zuletzt bearbeitet von Yogu am Sa 15.01.11 14:02, insgesamt 3-mal bearbeitet
Für diesen Beitrag haben gedankt: FelixD, huuuuuh
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 15.01.11 02:49
Wobei die Überladung dann aber so aussehen sollte:
C#-Quelltext 1: 2: 3: 4: 5:
| public Poly() { this.deg = 0; this.coef = new ModInt[0]; } |
um auch den Compiler zufrieden zu stellen 
|
|
FelixD 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 15.01.11 19:02
Danke für eure Antworten. Was ihr nicht wissen konntet und ich nicht gesehen habe, ist das dieser Code noch aus einem ganz anderen Grund nicht funktionieren kann. 0 ist ein Integer und kein ModInt ...
Es ist mir auch nicht möglich eine 0 und eine 1 für ModInts zu implementieren, da diese immer auch die einen Member p haben, der angibt Modulo welcher Primzahl gerechnet wird.
Aus diesem Grund ist es also gar nicht möglich mein Vorhaben in die Tat umzusetzen
@Th69
Im Fall des Nullpolynoms gilt deg=coef.Length - 1 nicht.
@Yogu
Wenn man es so schreibt ist es natürlich schön. Ich dachte nur, dass das nicht funktioniert (warum auch immer).
Danke!
lg
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Sa 15.01.11 20:59
FelixD hat folgendes geschrieben : | | 0 ist ein Integer und kein ModInt ... |
Da gibt es eine ganz elegante Abhilfe: Automatische (implizite) und manuelle (explizite) Konvertierung zwischen int und ModInt. In einem anderen Thread hat schon jemand geschrieben, wie das geht:
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 16.01.11 12:14
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 16.01.11 13:44
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 16.01.11 18:23
Yogu hat folgendes geschrieben : | | Das heißt also, dass eine Ganzzahl in verschiedene ModInts umgewandelt werden kann? |
Genau, es geht wohl um Polynome über Restklassenkörper.
Aber auf die Ints muss deswegen ja nicht verzichtet werden. Da alle ModInts wohl aus dem gleichen Körper stammen sollten, tut es auch ein Konstruktor Poly(int p, params int[] coef).
_________________ >λ=
|
|
FelixD 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 16.01.11 19:54
| Zitat: | Genau, es geht wohl um Polynome über Restklassenkörper.
Aber auf die Ints muss deswegen ja nicht verzichtet werden. Da alle ModInts wohl aus dem gleichen Körper stammen sollten, tut es auch ein Konstruktor Poly(int p, params int[] coef). |
Das hast du richtig erkannt. Zunächst wollte ich eigentlich eh keine Struktur ModInt implementieren, dachte mir dann aber, dass es auf diese Weise mehr dem Prinzip der objektorientierten Programmierung entspricht und wenn ich es recht bedenke, dann war diese Entscheidung auch ganz gut, da ich mich nicht in den Poly-Methoden mit der Moduloarithmetik herumschlagen muss ...
|
|