Autor Beitrag
FelixD
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.01.11 17:33 
Ich habe folgenden Konstrukor gegeben:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.01.11 18:08 
Das heißt also ich müsste den Konstruktur umschreiben zu:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 14.01.11 18:11 
ja
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 14.01.11 18:41 
Du könntest auch den Parameter "int deg" entfernen und ihn mittels
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 14.01.11 23:28 
Wie wär's denn mit Überladung?

ausblenden 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.

user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
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

ausblenden C#-Quelltext
1:
public static Poly Zero = new Poly(-1new ModInt[] { });					

zu schreiben? Aber Überladung ist natürlich auch möglich.

Edit: Der erste Code enthält einen Fehler, siehe user profile iconTh69s 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 15.01.11 02:49 
Wobei die Überladung dann aber so aussehen sollte:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public Poly()
{
  this.deg = 0// bzw. -1
  this.coef = new ModInt[0];
}

um auch den Compiler zufrieden zu stellen ;-)
FelixD Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 15.01.11 20:59 
user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Das einzige, was du machen kannst, ist zusätzlich einen expliziten bzw. impliziten Konvertierungsoperator für int nach ModInt anzubieten, s. explicit (C# Referenz) sowie implicit (C# Referenz).
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 16.01.11 12:14 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
0 ist ein Integer und kein ModInt ...

Da gibt es eine ganz elegante Abhilfe:[...]
Lies mal einen Satz weiter ;) .

_________________
>λ=
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 16.01.11 13:44 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
0 ist ein Integer und kein ModInt ...

Da gibt es eine ganz elegante Abhilfe:[...]
Lies mal einen Satz weiter ;) .

Ich gebe zu, dass ich den Satz nicht ganz verstanden habe. Das heißt also, dass eine Ganzzahl in verschiedene ModInts umgewandelt werden kann? Dann verstehe ich auch, warum keine Konvertierung möglich ist.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 16.01.11 18:23 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 ...