| |
|
|
Jörg Sellmeyer | Mit folgendem Code kann man die Multiplikatoren einer Zahl finden, die sich am nächsten liegen. Bei z. B. 20 sind das dann 5 und 4. Gleichzeitig kann man die Funktion noch als Primzahlidentifizierer benutzen.
Proc IsInt
Parameters f!
Return (f! - Int(f!) = 0)
EndProc
Proc NaheMultiplikatoren
Parameters Wert&[],Zahl&
Declare f1&,f2&,f!,f1!
f! = SQrt(Zahl&)
Case Zahl& = 0:Return 0
If IsInt(f!)
Wert&[0] = f!
Wert&[1] = f!
Else
WhileLoop 0,Int(f!)
f1& = Int(f!) - &Loop
f1! = Zahl& / f1&
If IsInt(f1!)
Wert&[0] = f1&
Wert&[1] = Zahl& / f1&
Break
EndIf
Wend
EndIf
Return f!
EndProc
Cls
Declare Test&[2],ZufallsZahl&
Randomize
Print "bitte Taste oder Mausklick"
While 1
WaitInput
Cls
ZufallsZahl& = Rnd(10000000)
NaheMultiplikatoren(Test&[],ZufallsZahl&)
Print "Nahe Multiplikatoren sind",Test&[0],"*",Test&[1],"=",ZufallsZahl&
Print
Print ZufallsZahl&,"ist",If(Test&[0] = 1,"","k");"eine Primzahl"
Wend
|
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 18.05.2018 ▲ |
|
|
|
|
p.specht
| Hab´s etwas weiterentwickelt zu einem Primzahlenfinder auf FLOAT-Basis...
WindowTitle "Zufallsprimzahlengenerator"
'(D)Demo 2018-05 by P.Specht/Wien, nach einer Idee von Jörg Sellmeyer
proc frac :parameters x!:var s!=(x!>0)-(x!<0):x!=abs(x!)
x!=x!-round(x!,0):case x!<0:x!=1+x!:return s!*x!
endproc
proc intf :parameters x!
var s!=(x!>0)-(x!<0)
x!=abs(x!)
x!=x!-frac(x!)
return s!*x!
endproc
Proc IsIntf
Parameters f!
Return (f! - Intf(f!) = 0)
EndProc
Proc NaheMultiplikatoren
Parameters Wert![],Zahl!
Declare a!,f_0!,f_1!
f_0! = Sqrt(Zahl!)
Case Zahl!=0:Return 0
If IsIntf(f_0!)
Wert![0] = f_0!
Wert![1] = f_0!
Else
WhileLoop 0,Intf(f_0!)
a! = Intf(f_0!) - &Loop
f_1! = Zahl! / a!
If IsIntf(f_1!)
Wert![0] = a!
Wert![1] = Zahl! / a!
Break
EndIf
Endwhile
EndIf
Return f_0!
EndProc
Cls
Declare Test![1],ZufallsZahl!
Randomize:set("decimals",1)
While 1
ZufallsZahl! = intf(10000000.00000*Rnd()+rnd())
NaheMultiplikatoren(Test![],ZufallsZahl!)
If (Test![0]=1.0) and (Test![1]>1.0)
cls
Print "\n Nah-Multiplikatoren:",Test![0],"*",Test![1],"=",ZufallsZahl!
' If (Test![0]=1.0) and (Test![1]>1)
font 2
print "\n Diese Zufallszahl ist eine Primzahl!"
sound 60,16
font 0
waitinput 1000
Endif
Endwhile
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 19.05.2018 ▲ |
|
|
|
|
Jörg Sellmeyer | Da würde ich ja eher Doubles Quadint (meinte ich natürlich!) als Übergabeparameter nehmen. Und wenn es nur um die Primzahlen geht, kann man das ja noch sehr beschleunigen, wenn man 0 zurückgibt, sobald der erste Multiplikant <> 1 gefunden ist. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 20.05.2018 ▲ |
|
|
|
|
p.specht
| Stimmt, danke! Bin aber noch auf XProfan-11, warte auf die Vollversion von X4. Ausserdem läuft die Schleife dzt. nur mit Integers. Wenn´s bei Float zu lange dauert, müsste man auf Inline-Assembler ausweichen. Deine Idee ist aber super! |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 20.05.2018 ▲ |
|
|
|
|
Jörg Sellmeyer | Und man kann natürlich vornedran auch noch ein Sieb einbauen, in dem alle Zahlen hängenbleiben, die durch 2,3,5,7,11,13,17,23,... primzahl&& teilbar sind und einen Wert > 1 ergeben. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 20.05.2018 ▲ |
|
|
|
|
p.specht
| ..und mit Mersenne-Primzahlen arbeiten... da gibt es Formeln. Ich brauche aber echte Zufallsprimeln für RSA, da kann es ruhig etwas länger dauern |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 20.05.2018 ▲ |
|
|
|
|
Jörg Sellmeyer | Das Sieb ist ja nur, um den Vorgang zu beschleunigen, indem Zahlen schneller rausgeworfen werden, die keine Primzahlen sind.
Also:
|
|
|
| |
|
|
|
p.specht
| Alles klar. So, bin dann wieder auf Paules PC-Forum / Xprofan zu finden... |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 20.05.2018 ▲ |
|
|
|