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:

A MOD B

 
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
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 01.09.2023, 16:42    Titel: A MOD B Antworten mit Zitat

Hallo liebes Forum, ich brauche mal wieder eine Lösung.

Ich arbeite zwar sehr selten mit Zahlen größer 64Bit, aber nun stellte sich ein Problem.

Sagen wir es kurz:

Wir haben als Bsp:

#include "Big-Int overload.bi"
DIM AS BIGINT A,B,C

A="170141183460469231731687303715884105703"
B="8917249871249871984719971"

C soll sein A MOD B, also der Rest bei der Division von A durch B

Ausgabe C

Frage: Wie wird über die Biblothek BIG_INT dieses C = A MOD B als Quellcode geschrieben ?

C = A MOD B geht ja nicht in dem Zusammenhang.

Addition, Subtraktion und Division läuft normal ...


Vielen Dank !

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4637
Wohnort: ~/

BeitragVerfasst am: 01.09.2023, 19:13    Titel: Antworten mit Zitat

Leider kenne ich mich mit der Bibliothek nicht aus. In der eingebundenen .bi-Datei sollten aber alle Funktionsheader stehen - gibt es da etwas Vielversprechendes?
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 01.09.2023, 19:36    Titel: Antworten mit Zitat

Ich kenne mich da auch nicht aus....da steht was von

"declare function big_int_mod(byval a as const big_int ptr, byval b as const big_int ptr, byval answer as big_int ptr) as long"

Wenns das ist.

Probeweise habe ich C = A MOD B mit C = A - ( A / B ) * B ersetzt.

Mich interessierte in einem Laufzeitvergleich aus dem MP-Forum die Rechenzeit.

Quelle: https://matheplanet.com/matheplanet/nuke/html/viewtopic.php?rd2&topic=263369&start=0#p1914249
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2514
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 01.09.2023, 20:51    Titel: Antworten mit Zitat

Verweis an dieser Stelle auf

https://www.freebasic.net/wiki/KeyPgOperator

Hat der Programmierer dieser BigInt-Bibliothek den mod-Operator entsprechend ausprogrammiert, so kannst Du ganz normal Ausdrücke schreiben.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 02.09.2023, 14:00    Titel: Antworten mit Zitat

Danke erstmal...ich habe keine Nerven ewig zu probieren.
Dachte eher, einer weiß die passende *.bi und den Syntax dazu.

Ohne dem MOD-Befehl , läuft das Testprogramm ca. 25% schneller...also man kann es abschätzen.

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4637
Wohnort: ~/

BeitragVerfasst am: 02.09.2023, 14:14    Titel: Antworten mit Zitat

Code:
declare function big_int_mod(byval a as const big_int ptr, byval b as const big_int ptr, byval answer as big_int ptr) as long

klingt für mich am ehesten nach dem Aufruf
Code:
big_int_mod(@a, @b, @c)     ' (statt c = a mod b)

Der Rückgabewert ist dann vermutlich ein Fehlercode bzw. ein Wert, der anzeigt, ob alles geklappt hat.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1230
Wohnort: Ruhrpott

BeitragVerfasst am: 02.09.2023, 19:34    Titel: Re: A MOD B Antworten mit Zitat

pzktupel hat Folgendes geschrieben:
C = A MOD B geht ja nicht in dem Zusammenhang.


Doch, das geht, du mußt nur den Operator MOD entsprechend überladen (in Ermangelung der "Big-Int overload.bi" ungetestet):
Code:
#Include "Big-Int overload.bi"

Operator Mod (x As big_int, y As big_int) As big_int
   Dim As big_int result
   big_int_mod(@x, @y, @result)
   Return result
End Operator

Dim As big_int A, B, C

A="170141183460469231731687303715884105703"
B="8917249871249871984719971"

C = A Mod B

Print C

Sleep

Wobei ich mal davon ausgehe, daß big_int in der .bi als Type definiert wurde. Der Rückgabewert der Funktion big_int_mod geht dabei allerdings verloren.

Gruß
grindstone[/i]
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 02.09.2023, 21:46    Titel: Antworten mit Zitat

Hm, so ist es. Es lässt sich kompilieren, aber der Wert für A Mod B ist immer 0
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1230
Wohnort: Ruhrpott

BeitragVerfasst am: 03.09.2023, 18:42    Titel: Antworten mit Zitat

Vielleicht bleibt bei der Division ja wirklich kein Rest. grinsen

Probier mal diese Modifikation und sieh dir an, was die big_int_mod innerhalb der Überladefunktion von sich gibt:
Code:
Operator Mod (x As big_int, y As big_int) As big_int
   Dim As big_int result
   Print big_int_mod(@x, @y, @result)
   Print result
   Return result
End Operator


Mehr kann ich dazu jetzt ohne Quellcode nicht sagen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 03.09.2023, 19:00    Titel: Antworten mit Zitat

Print @result habe ich geschrieben, dann kompilierte er es.

Ausgeben tut er an der Stelle nix.
Wir belassen das , es ist ziemlich kompliziert in FB, wenn man den 64bit Bereich verlassen will...finde ich.

Abgesehen davon, ist alles sehr langsam, wenn man diese Spezialgrößen verrechnen will. neutral
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1230
Wohnort: Ruhrpott

BeitragVerfasst am: 03.09.2023, 20:33    Titel: Antworten mit Zitat

pzktupel hat Folgendes geschrieben:
Print @result habe ich geschrieben, dann kompilierte er es.

Ausgeben tut er an der Stelle nix.
Hat dein TYPE big_int denn eine Property, die das Ergebnis in einen String zurückverwandelt? Ansonsten weiß der Compiler nämlich nicht, was er mit dem "Print"-Befehl eigentlich ausdrucken soll. @result liefert nur den Pointer auf die Variable, das ist je nach System ein 32- oder 64-bit unsigned integer.

Wenn es kein Geheimnis ist, poste doch mal den Quellcode von big_int_mod und die Typendeklaration von big_int, damit wir sie uns ansehen können.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 03.09.2023, 20:38    Titel: Antworten mit Zitat

Das ist kein Geheimnis.
Mir ging es einfach um einen Beispielcode, der C= A MOD B berechnet, wobei A und B >2^64 sind....also über BIGINT definiert.
_________________
Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1230
Wohnort: Ruhrpott

BeitragVerfasst am: 03.09.2023, 21:01    Titel: Antworten mit Zitat

Vielleicht helfen dir diese Links weiter (alles in FreeBASIC):

https://www.freebasic-portal.de/code-beispiele/mathematik/einfache-schnelle-bigint-erweiterung-284.html
https://github.com/stephanbrunker/big_integer
https://www.freebasic.net/forum/viewtopic.php?t=15250&hilit=bigint

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 102

BeitragVerfasst am: 04.09.2023, 19:30    Titel: Antworten mit Zitat

Das war alles schon nah dran...
Der Operator Mod ist in 'Big-Int overload.bi' tatsächlich nicht ausgearbeitet.
Das Unterprogramm divext berechnet Div und Mod in einem Schritt.
Man kann die Datei 'Big-Int overload.bi' aber auch für sich selbst kopieren, umbenennen und erweitern.
Code:
#Include "Big-Int overload.bi"

Operator Mod (Byref lhs As bigint, Byref rhs As bigint) As bigint
   Dim As bigint result
   big_int_mod(lhs.numptr, rhs.numptr, result.numptr)
   Return result
End Operator

Sub divext(Byref a As bigint, Byref b As bigint, Byref q As bigint, Byref r As bigint)
   big_int_div_extended(a.numptr, b.numptr, q.numptr, r.numptr)
End Sub

Dim As bigint a,b,q1,r1,q2,r2

a = "170141183460469231731687303715884105703"
b = "8917249871249871984719971"

q1 = a/b
r1 = a Mod b

Print a
Print b
Print q1
Print r1
Print

divext(a,b,q2,r2)

Print a
Print b
Print q2
Print r2
Print

Print "a = "; a
Print "a = "; q1*b+r1
Print "a = "; q2*b+r2

Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 102

BeitragVerfasst am: 04.09.2023, 20:02    Titel: Antworten mit Zitat

Mit Stephan Brunker's big_integer.bas ist es einfacher. Ob die Rechengeschwindigkeit ausreicht muss man ausprobieren.
Das ist der erste Link von grindstone, der zweite Link ist aber auch interessant.
Code:
#Include "big_integer.bas"

Dim As Bigint a,b,q1,r1,q2,r2

a = "170141183460469231731687303715884105703"
b = "8917249871249871984719971"

q1 = a\b ''Hier ist es der Rückstrich!!!
r1 = a Mod b

Print a
Print b
Print q1
Print r1
Print

bigint.div(a,b,q2,r2)

Print a
Print b
Print q2
Print r2
Print

Print "a = "; a
Print "a = "; q1*b+r1
Print "a = "; q2*b+r2

Sleep

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 05.09.2023, 12:11    Titel: Antworten mit Zitat

@hhr

Vielen Dank, das hat aus dem Vorletzten post (ohne #Include "big_integer.bas" ) geklappt !

Damit ist die Anfrage geklärt.
Seltsam ist aber echt, warum das Testprogramm langsamer (+50%) fertig ist, als das b = c MOD d über

a = c / d
b = c - ( a * d)

zu regeln.

LG
_________________
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: 102

BeitragVerfasst am: 05.09.2023, 19:20    Titel: Antworten mit Zitat

In meinem Rechner ist divext das schnellste.
Es wird ein Verfahren verwendet, das Quotient und Rest in einem Arbeitsgang berechnet.
Die zugrundeliegende Funktion wird auch für '/' und 'Mod' verwendet.
Wegen des zusätzlichen Aufwandes sind '/' und 'Mod' langsamer.
Insbesondere dann, wenn man Quotient und Rest braucht, lohnt es sich divext zu verwenden.

Quelle:
https://github.com/valyala/big_int/blob/master/libbig_int/src/basic_funcs.c
Code:
#Include "Big-Int overload.bi"

Operator Mod (Byref lhs As bigint, Byref rhs As bigint) As bigint
   Dim As bigint result
   big_int_mod(lhs.numptr, rhs.numptr, result.numptr)
   Return result
End Operator

Sub divext(Byref a As bigint, Byref b As bigint, Byref q As bigint, Byref r As bigint)
   big_int_div_extended(a.numptr, b.numptr, q.numptr, r.numptr)
End Sub

Dim As bigint a,b,q1,r1,q2,r2,q3,r3
Dim As Double t1,t2,t3,t4,t5,t6
Dim As Ulong i,j=1000000

a = "170141183460469231731687303715884105703"
b = "8917249871249871984719971"

t1=Timer
For i=0 To j
   r1 = a Mod b
Next i
t2=Timer

t3=Timer
For i=0 To j
   q2 = a/b
   r2 = a-q2*b
Next i
t4=Timer

t5=Timer
For i=0 To j
   divext(a,b,q3,r3)
Next i
t6=Timer

Print "a Mod b:   ";t2-t1
Print "a-(a/b)*b: ";t4-t3
Print "divext:    ";t6-t5

Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pzktupel



Anmeldungsdatum: 07.07.2020
Beiträge: 85

BeitragVerfasst am: 06.09.2023, 09:42    Titel: Antworten mit Zitat

Oha @hrr!

Das ist in der Tat mind. 50% schneller !
_________________
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: 85

BeitragVerfasst am: 11.09.2023, 21:42    Titel: Antworten mit Zitat

Nochmals dankeschön, wer hätte das gedacht, das tatsächlich der Operator "divext" mir heute eine Erleichterung brachte ?!

Die Konvertierung einiger Primzahl-7-Tupel konnte somit zügiger in eine Kurzfassung überführt werden lächeln

Falls von Interesse ( unter September 2023)

https://pzktupel.de/KTHIST/kthist2023.php
_________________
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
Seite 1 von 1

 
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