Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

FB-Referenz - Bug-Report
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 20.10.2021, 22:52    Titel: Antworten mit Zitat

Zunächst einmal die beiden Beispiele.
Wenn die bei Dir funktionieren, hast Du das ja noch eingebaut.
Wenn nicht, muss ich meine Cloud und das Urheberrecht bemühen.
Code:
#include "Big-Int overload.bi"
Dim As bigint p,p_ref
p="1" & String(99,"0")
p_ref=p+"84878086452295590307"
p=p+"84878086452295590200"
For i As Long=1 To 12
   p=bigint_next_prime(p)
   Print p,p-p_ref
Next
Sleep
'
Code:
#include "Big-Int overload.bi"
Dim As bigint p,p_ref
p="1" & String(99,"0")
p_ref=p+"707220670972957883551"
p=p+"707220670972957883000"
For i As Long=1 To 12
   p=bigint_next_prime(p)
   Print p,p-p_ref
Next
Sleep
'
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 21.10.2021, 05:20    Titel: Antworten mit Zitat

Prima, das geht!

Ich habe mal noch eine Anfrage.

In der Datei Big-Int overload.bi sind ja nun viele solcher Befehle drin.

Für einen Test auf Primzahl würde ja über bigint_next_prime(N) gehen, wenn
ich vergleiche ob ich eine N-1 mit N der Abstand 0 wäre, aber ich fand noch
bessere Befehle. Zum Bsp. würde mir genügen "bigint_is_prime" oder

big_int_miller_test oder big_int_pow

Wenn ich nach meinen Versuchen diese einsetze, dann kommt beim kompilieren "Type mismatch, at parameter 3 of BIG_INT_POW() in ...."

Wie könnte das richtig heißen, um auch diese Befehle zu nutzen ?
Mir sind die Variablen in den Klammern nicht klar, besonders, weil es manchmal auch 2 o 3 sind.

Danke !
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 21.10.2021, 21:44    Titel: Antworten mit Zitat

In
https://github.com/valyala/big_int/blob/master/libbig_int/src/number_theory.c
findet man zu big_int_next_prime:

Finds minimal pseudoprime, greater than number [a].
Warning: [answer] is not 100% prime. It is probably-prime!
Returns error number:
0 - no errors
other - internal error
int big_int_next_prime(const big_int *a, big_int *answer)

Erstaunlich ist, dass man die Beispiele damit nachvollziehen kann.

In der Datei findet man auch Bemerkungen zu den anderen Funktionen.
Ich möchte mich in diese Funktionen nicht einarbeiten, weil man bei Primtests genau wissen muss, wie man das Ergebnis zu deuten hat.

In 'Big-Int overload.bi' ist 'big_int_pow' in
Operator ^ ( Byref lhs As bigint, Byval rhs As long ) As bigint
und
Operator bigint.^= ( Byval rhs As long )
ausgearbeitet.


Zuletzt bearbeitet von hhr am 22.10.2021, 09:56, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 22.10.2021, 05:57    Titel: Antworten mit Zitat

Hm, okay, wie wäre den die Zeitabschätzung zwischen der Befehlnutzung
next_prime und is_prime ?
Meine Zeittests sagen erstmal aus, der in FB verwendenten Befehl "...next_prime" ist sehr langsam, denke dass ist bei is_prime nicht anders.

Aber bei next_prime ist es erstmal doch nützlich zu wissen, wie es geht und die Anwendung würde in wenigen Fällen etwas bringen, auch wenn der Test an sich durchaus 100mal langsamer ist als andere Ersatzprogramme.

Okay, ich lasse es erstmal so stehen. Danke nochmal.
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 84

BeitragVerfasst am: 22.10.2021, 19:44    Titel: Antworten mit Zitat

Ich habe mal versucht, bigint_is_prime und bigint_miller_test einzubauen.
bigint_is_prime ist in 'Big-Int overload.bi' nicht ausgearbeitet. Das habe ich hinzugefügt.
bigint_miller_test ist in 'Big-Int overload.bi' zwar vorhanden, ist aber anders als ich erwartet hatte.
Deshalb habe ich das als bigint_miller_test_2 erstellt.

Interessant ist die vorletzte Zahl, da sind sich beide Funktionen nicht einig.
Wenn level = 1 oder 2 gewählt wird, sind die Ergebnisse gleich.

Zur genauen Verwendung der Funktionen und insbesondere zu den Parametern kann ich nichts sagen.
Das Programm ist als Versuch zu werten.
Code:
#include "Big-Int overload.bi"

Function bigint_is_prime(Byref a As bigint, Byref primes_to As Ulong = 0, Byref level As Long = 0) As Long
   'Checks if [a] is probably prime.
   'is_prime = 0: if [a] is composite
   'is_prime = 1: if [a] is probably prime
   'is_prime = 2: if [a] is 100% prime
   Dim As Long is_prime
   If (big_int_is_prime(a.numptr, primes_to, level, @is_prime) = 0) Then
      Return is_prime
   Else
      Print "internal error"
      'Return -1
   End If
End Function

Function bigint_miller_test_2(Byref a As bigint, Byref _base As bigint) As Long
   'Checks the Miller primality test for number [a] with base [_base].
   'is_prime = 0: [a] is composite
   'is_prime = 1: [a] is a "strong PROBABLY prime" (Not 100% prime, only 75% by Rabin's theoreme)
   Dim As Long is_prime
   Select Case big_int_miller_test(a.numptr, _base.numptr, @is_prime)
   Case 0
      Return is_prime
   Case 1
      Print "[base] is too small. It must be 1 < base < (a - 1)"
   Case 2
      Print "[base] is too high. It must be 1 < base < (a - 1)"
   Case Else
      Print "internal error"
   End Select
End Function

'------------------------------------------------------------------------------

For i As Byte = 0 To 20
   Print i, bigint_is_prime(bigint(i)), bigint_miller_test_2(bigint(i),"2")
Next

Print "Weiter mit Taste..."
Sleep

Dim As Long level = 0 ' [0|1|2], see https://github.com/valyala/big_int/blob/master/libbig_int/src/number_theory.c
Dim As bigint p, pi
p = "1" & String(99,"0")
p = p+"84878086452295590300"
For i As Byte = 0 To 50
   pi = p+bigint(i)
   Print pi, bigint_is_prime(pi,,level), bigint_miller_test_2(pi,"2")
Next

Sleep
End
'

Man beachte wieder das vorletzte Ergebnis:
Code:
#include "Big-Int overload.bi"

Function bigint_is_prime(Byref a As bigint, Byref primes_to As Ulong = 0, Byref level As Long = 0) As Long
   'Checks if [a] is probably prime.
   'is_prime = 0: if [a] is composite
   'is_prime = 1: if [a] is probably prime
   'is_prime = 2: if [a] is 100% prime
   Dim As Long is_prime
   If (big_int_is_prime(a.numptr, primes_to, level, @is_prime) = 0) Then
      Return is_prime
   Else
      Print "internal error"
      'Return -1
   End If
End Function

Function bigint_miller_test_2(Byref a As bigint, Byref _base As bigint) As Long
   'Checks the Miller primality test for number [a] with base [_base].
   'is_prime = 0: [a] is composite
   'is_prime = 1: [a] is a "strong PROBABLY prime" (Not 100% prime, only 75% by Rabin's theoreme)
   Dim As Long is_prime
   Select Case big_int_miller_test(a.numptr, _base.numptr, @is_prime)
   Case 0
      Return is_prime
   Case 1
      Print "[base] is too small. It must be 1 < base < (a - 1)"
   Case 2
      Print "[base] is too high. It must be 1 < base < (a - 1)"
   Case Else
      Print "internal error"
   End Select
End Function

'------------------------------------------------------------------------------

Dim As Long level = 0 ' [0|1|2], see https://github.com/valyala/big_int/blob/master/libbig_int/src/number_theory.c
Dim As bigint p, pi
p = String(99,"9") & "98"
For i As Byte = 0 To 10
   pi = p+bigint(i)
   Print pi
   
   Select Case bigint_is_prime(pi,,level)
   Case 0
      Print "big_int_is_prime: Zahl ist zusammengesetzt"
   Case 1
      Print "big_int_is_prime: Zahl ist wahrscheinlich prim"
   Case 2
      Print "big_int_is_prime: Zahl ist prim"
   End Select
   
   Select Case bigint_miller_test_2(pi,"2")
   Case 0
      Print "big_int_miller_test: Zahl ist zusammengesetzt"
   Case 1
      Print "big_int_miller_test: Zahl ist wahrscheinlich prim"
   End Select
   Print String(50,"-")
Next i

Sleep
End
'
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 23.10.2021, 07:54    Titel: Antworten mit Zitat

Vielen Dank , BESTER MANN !

Ich habe mal paar einfache Tests laufen lassen.

Die Rabin_Miller Funktion läuft perfekt.

Hingegen bei der is_prime Funktion diese stark fehlerbehaftet ist, warum, weiß ich nicht.

Man teste:

pi="1000000000057"
Select Case bigint_is_prime(pi,,level)
Case 0
Print "big_int_is_prime: Zahl ist zusammengesetzt ";pi
Case 1
Print "big_int_is_prime: Zahl ist wahrscheinlich prim ";pi
Case 2
Print "big_int_is_prime: Zahl ist prim " ;pi
End Select

Ausgabe: big_int_is_prime: Zahl ist wahrscheinlich prim 1000000000057

Der is_prime Test muss ja zumindest den Fermattest machen und der wird wohl so nicht passen. So viele Zahlen haben keinen Pseudocharakter.

Grüße
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 81

BeitragVerfasst am: 23.10.2021, 13:35    Titel: Antworten mit Zitat

Korrektur:
Ich habe mir Dein Text nochmal durchgelesen und ....

dieser Test:

DIM AS ULONG z

Dim As Long level = 0 ' [0|1|2], see https://github.com/valyala/big_int/blob/master/libbig_int/src/number_theory.c
Dim As bigint p, pi

p="1000000001"
z=0
For i As ULONG = 0 To 1000000 STEP 2
pi = p+bigint(i)
IF bigint_is_prime(pi,,1)>0 THEN z+=1
Next i
PRINT z
Sleep
End

Gibt exakt die Anzahl der Primzahlen zwischen 10^10 und 10^10+10^6 aus...48155 ! 14s

Das ist extrem schnell für 500000 ,ohne Vorsieb !
Auch für 10^999 + findet er die Primzahlen +7 und +663 als aufeinanderfolgend.

Man , bin ich Dir unendlich dankbar !!!

Also läuft so
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6
Seite 6 von 6

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz