AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language probedivision -abbruch von schleife funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

probedivision -abbruch von schleife funktioniert nicht

Ein Thema von qwertz543221 · begonnen am 8. Okt 2009 · letzter Beitrag vom 8. Okt 2009
Antwort Antwort
qwertz543221
(Gast)

n/a Beiträge
 
#1

probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 19:00
ich möchte folgende proceudre (probedivision)abrrechen und mit dem restlichen code weitermachen, doch wieso kann ich die schleife nicht beenden, wenn die abbruchbedingung erreicht ist?
Delphi-Quellcode:
function tform1.miller_rabin(n: ansistring; t: longint):boolean;
label l;
var
  n1,n2, y, r, x: string;
  s,j,i: longint;
const
 primes:array[1..5]of string=('2','3','5','7');//in meinem fall deujtlich größer
   // probedivison
function probedivision(n:ansistring):boolean;
var
 I:longint;
begin
i:=1;
result:=true;
while i<=5{9549} do
begin
if mathe.modulo(n,primes[i])='0'
 then
 begin
 result:=false;
 break;
 end
   else i:=i+1;
end;
end;

begin
result := false;
if Mathe.istGerade(n)
  then exit;

begin
{get n1 = n - 1} 
{get n2 = n - 2}
if probedivision(n)=true
 then
  begin
  n1 := n;
  Mathe.Minus1(n1);
  n2 := n1;
  Mathe.Minus1(n2);

  {calculate r,s with n-1=2^s*r} 
  r := n1;
  s := 0;
  while Mathe.istGerade(r) do
   begin
   r := Mathe.Quotient(r,'2');
   inc(s);
   end;
   while t>0 do
   begin
    {generate a in the range 2<=a<n-1, calculate y = a^r mod n}
    y := Mathe.Zufallszahl('2', n2);
    y := Mathe.PotenzModulo(y,r,n);
    {if y<>1 and y<>n-1 do}
    if (y<>'1') and (y<>n1)
     then
     begin
     j := 1;
     while (j <= s-1) and (y<>n1) do
     begin
     y := Mathe.ProduktModulo(y,y,n);
     {if y=1 then composite} 
     if y='1
      then exit;
     inc(j);
     end;
      {if y<>n1 then composite} 
      if y<>n1 then exit;
    end;
    dec(t);
  end;
  {probably prime now}
  result := true;
end;
end;
end;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 19:06
Hallo,


Breakpoint auf
if mathe.modulo(n,primes[i])='0'

und nachsehen, warum nicht 0 rauskommt.


Heiko
Heiko
  Mit Zitat antworten Zitat
qwertz543221
(Gast)

n/a Beiträge
 
#3

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 19:10
passiert ist gar nichts, noch nicht einmal der breakpunkt hat gestoppt.

es muss null, rauskommen, denn die prüfmessage wird angezeigt.(habe ich nach der abfrage eingebaut)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 19:15
Oha! ... sieht das in Deiner IDE auch so aus?

Rücke mal den Quelltext ordentlich zurecht, dann liest sich das schon mal leichter (und Fehler finden sich wie von selbst ).
Welche Schleife und Bedingung meinst Du genau?

Wenn die Bedingung erfüllt ist, wird der Compiler das auch berücksichtigen.
Also wird "break" mit Sicherheit gar nicht erreicht.

Stahli


[EDIT]
Wenn der Breakpoint nicht erreicht wird, ist sicher schon Mathe.istGerade(n) erfüllt und Exit ausgeführt...
Also Breakpoint auf die erste Zeile der Prozedur und sehen, was passiert.
  Mit Zitat antworten Zitat
qwertz543221
(Gast)

n/a Beiträge
 
#5

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 19:20
ich habe den break point auf den funktionskopf der inneren funktion gelegt, abbruch passierte trotzdem keiner - entschuldigt dei formatierung, ich stell es es gleich neu ein.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 19:22
Du sollst den Breakpoint auf
Zitat:
if probedivision(n)=true
setzen und durchsteppen. Und lass mal die Abfrage auf true weg, die ist nicht nur unnötig, sondern kann auch falsche Ergebnisse liefern.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
8. Okt 2009, 20:09
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Delphi-ähnliches Thema. *g*
qwertz543221
(Gast)

n/a Beiträge
 
#8

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 20:24
ok habe ich gemacht - es funktioniert soweit. Danke

noch eine weitere frage:
ist es überhaupt günstig, erst probedivision bei der vordefinierten liste zu machen, bevor andere primzahltests angesetzt werden? - wenn nein, was wäre eine effizientere vorgehensweise?
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

Re: probedivision -abbruch von schleife funktioniert nicht

  Alt 8. Okt 2009, 22:11
Zitat von qwertz543221:
ok habe ich gemacht - es funktioniert soweit. Danke

noch eine weitere frage:
ist es überhaupt günstig, erst probedivision bei der vordefinierten liste zu machen, bevor andere primzahltests angesetzt werden? - wenn nein, was wäre eine effizientere vorgehensweise?
Ich konnte mir eigentlich nicht vorstellen, daß man meine Miller-Rabin-Funktion so versauen kann.

Selbstverständlich hat die Probedivision in der Funktion nichts zu suchen, wenn man nicht wieder alle Bedeutungen auf den Kopf stellen will. Wenn Du Deine Funktion IsProbablePrime oder ähnlich genannt hättest, wäre es OK. Im übrigen würde man die Anzahl der Probedivisionen abhängig von Bitlänge von n machen.

Außerdem: Da Du aber, wie üblich offensichtlich völlig ahnungslos, einfach Code zusammenwürfelst, hast Du übersehen, daß Deine Primzahlliste selbstverständlich bei 3 anfangen (bzw die 2 nicht enthalten) sollte, da Du direkt vor der ersten Probedivision durch 2 ausgeschlossen hast, daß n gerade ist. Oder ist Dir nicht klar, daß "n mod 2 = 0" dasselbe bedeutet wie "n ist gerade"?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz