Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Modulares Potentieren???


ute.h_80 - Mo 24.11.03 17:57
Titel: Modulares Potentieren???
:?

Hallo!
Kann mir jemand erklären wie man modulares Potenzieren in Delphi realisieren kann :?:

Hab auch schon nen Java Algorithmus aber kann das nicht umsetzen: :cry:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
z = 1 
   while b != 0 do 
        while (b mod 2) = 0 do 
            b = b / 2 
            x = x2 mod n 
        end 
        b = b - 1 
        z = (z * x) mod n 
        end 
   end


Gruß Ute


barfuesser - Mo 24.11.03 19:22


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
z := 1;
while b <> 0 do
begin 
  while (b mod 2) = 0 do
  begin 
    b := b div 2 ;
    x := x2 mod n; 
  end;
  b := b - 1;
  z := (z * x) mod n;
end;


jetzt müßte man nur noch wissen, wo b, x2 und n herkommen.

barfuesser


ute.h_80 - Mo 24.11.03 19:36

b, x, und n sind eingegebene Int64 Werte

und x2 hat ich vergessen zu ändern ist in echt x hoch 2 oder (x*x)
Schuldigung :!:

Hab deinen Code ausprobiert aber das Programm stürzt immer wieder ab und geht nur noch übern TaskManager zu beenden. :(

Danke für deine mühe!


ute.h_80 - Mo 24.11.03 19:49

Hab sonst auch noch den richtigen Java Code, falls das was nützt!

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:
27:
28:
29:
30:
31:
32:
public void modexp() {
         x = xField.getLongKey();
   b = bField.getLongKey();
   n = nField.getLongKey();
   int pos, first = 2;
   
   String bin = Long.toBinaryString(b);
   binField.setText(bin);

   comp.setText(" (i) b"+newline+newline);
   long z = 1;
   for (int i = 0; i < bin.length(); i++) { // internal string index
      char bi = bin.charAt(i);
      pos = bin.length() -i -1; // index as to algorithm
      if (pos < 10) { comp.append(" "); };
      comp.append("(" + (pos) + ") " + bi);

      // square
      comp.append(" z = "+ z +" ** 2");
      if (first > 0) { first--; comp.append(" mod "+ n); }
      z = Helpers.mod(z,z,n);
      comp.append(" = " + z + newline);

      // maybe multiply
      if (bi == '1') {
         comp.append("       z = "+ z +" * "+ x);
         z = Helpers.mod(z,x,n);
         if (first > 0) { first = 0; comp.append(" mod "+ n); }
         comp.append(" = "+ z + newline);
      }
   }
   }


ute.h_80 - Di 25.11.03 12:40

Danke, ich habs jetzt doch noch hingekriegt :D