Italia
Fonte/ Codesnippets

Nahe Multiplikatoren einer Zahl finden Primzahl

 

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 11
Computer: 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 naturalmente!) 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 corre 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 naturalmente 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 per RSA, da kann es ruhig etwas länger dauern
 
XProfan 11
Computer: 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:
If (Eingang&& \ Prim&&) > 1

    Print "kann keine Primzahl sein"
    return 0

ElseIf (Eingang&& \ NaechstePrim&&) > 1

    ...

EndIf

 
XProfan X3
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
20.05.2018  
 




p.specht

Alles klar.
So, bin dann wieder auf Paules PC-Foro / Xprofan zu finden...
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
20.05.2018  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

9.192 Views

Untitledvor 0 min.
Matzbub26.01.2024
Stringray05.01.2022
p.specht18.11.2021
Roland Schäffer18.11.2021
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

p.specht (4x)
Jörg Sellmeyer (4x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie