Entwickler-Ecke

Algorithmen, Optimierung und Assembler - quadratischer Rest der Restklasse m mit Eclips


annemaria 1404 - Di 30.10.12 20:57
Titel: quadratischer Rest der Restklasse m mit Eclips
Hallo,

ich verzweifle gerade an einer Aufgabe...
Ich soll mit Eclips eine Funktion Programmieren, die testet, ob die Zahl a quadratischer Rest der Restklasse m ist.

Kann mir diesbezüglich jemand helfen?


platzwart - Di 30.10.12 22:02

Wo genau ist das Problem. Und was bedeutet "Rest der Restklasse m"?


annemaria 1404 - Mi 31.10.12 12:53

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Wo genau ist das Problem. Und was bedeutet "Rest der Restklasse m"?


Das genau Problem besteht darin das ich die Restklassen mit Zettel und Stift bestimmen kann aber die Umsetzung in ein Programm bekomme ich nicht hin. Zum Mathematischen Hintergrund habe ich mal das Skript angehangen in dem die Aufgabe drin steht und alles erklärt ist (Seite 18 - 23).

Wie schon geschrieben verstehe ich den Hintergrund und kann es auch berechnen aber leider nicht auf Eclips übertragen.


Gammatester - Mi 31.10.12 16:46

Ich weiß zwar nicht was Eclips ist und was Du genau nicht übertragen, aber vielleicht helfen Dir die Pascal-Routinen aus meinem MPArith 1.23.24 [http://www.wolfgang-ehrhardt.de/misc_de.html#mparith] weiter (die neue Version von vorgestern hat leicht geänderte Unitstruktur: modulare Arithmetik, GGT/KGV, Jacobi/Kronecker sind jetzt in in der neuen mp_modul).

Es sind dort sowohl Integer- als auch Langzahl-Funktionon zur Berechnung des Jacobi-Symbols vorhanden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function  jacobi32(a,b: longint): integer;
  {-Compute the Jacobi/Legendre symbol (a|b), b: odd and > 2}

function  kronecker32(a,b: longint): integer;
  {-Compute the Kronecker symbol (a|b)}

function  mp_jacobi(const a,n: mp_int): integer;
  {-Compute the Jacobi/Legendre symbol (a|n), n: odd and > 2}

function  mp_jacobi_lm(a: longint; const n: mp_int): longint;
  {-Compute the Jacobi/Legendre symbol (a|n), n: odd and > 2}

function  mp_jacobi_ml(const a: mp_int; n: longint): longint;
  {-Compute the Jacobi/Legendre symbol (a|n), n: odd and > 2}

function  mp_kronecker(const a,n: mp_int): integer;
  {-Compute the Kronecker symbol (a|n)}

Auch viele Funktionen für modulare Qudratwurzeln (für Deine Seiten 21-23) sind in der Unit mp_numth implementiert.

Vielleicht hilfts weiter!
Gruß Gammatester


Mathematiker - Fr 02.11.12 18:54

Hallo,
Gammatesters Routinen sind für große Zahlen hervorragend geeignet, Dein Problem zu lösen.

Ich vermute, dass Du "Eclipse" für Java meinst.
Solltest Du nur kleine Zahlen bearbeiten wollen, dann genügt eine einfache Routine zur Berechnung des Legendre-Symbols (allgemein Jacobi-Symbol), z.B.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function jac(x,y:integer):integer;
var m8, temp, res: integer;
begin
    if (y<3or (not odd(y)) then
    begin
       jac:=0;
       exit
    end;
    res:=1;
    while true do
    begin
       x:=x mod y;
       if x=0 then begin jac:=0; exit end;
       while not odd(x) do
       begin
          x:=x div 2;
          m8:= y mod 8;
          if (m8 = 3or (m8 = 5then res := -res;
       end;
       if x = 1 then begin jac:=res; exit end;
       temp:= x;
       x := y;
       y := temp;
       if (x mod 4 = 3and (y mod 4 = 3then res:=-res;
    end;
end;

Nach Java musst Du es aber selbst übersetzen.

Sollst Du prüfen, ob a quadratischer Rest modulo p (p prim!) ist, dann ist jac(a,p) = 1.
Schwieriger wird es, wenn modulo n zu rechnen ist und n eine zusammengesetzte Zahl ist. Dann benötigst Du eine vollständige Primfaktorzerlegung von n. In der EE gibt es genügend Beispiele dazu.
Da aber in der Aufgabe
Zitat:
Dabei kann auf eine Primzahlüberprüfung von m verzichtet werden.

steht, genügt wohl die einfache Legendre-Symbol-Routine.
Unter http://code.google.com/p/mapreduce-integer-factorization/source/browse/java/com/javiertordable/mrif/Legendre.java?r=7bdcbb5870a57bf4e7701dd973d5db4069a31c19 gibt's auch einen Java-Text für das Legendre-Symbol.

Beste Grüße
Mathematiker


annemaria 1404 - Mo 05.11.12 14:23

vielen Dank für eure Zahlreiche Hilfe
Das hat mir sehr geholfen!