Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 01.09.2023, 16:42 Titel: A MOD B |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4604 Wohnort: ~/
|
Verfasst am: 01.09.2023, 19:13 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
dreael Administrator
![](images/avatars/112279543641421ec80e8e2.gif)
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.09.2023, 20:51 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 02.09.2023, 14:00 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4604 Wohnort: ~/
|
Verfasst am: 02.09.2023, 14:14 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 02.09.2023, 19:34 Titel: Re: A MOD B |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 02.09.2023, 21:46 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 03.09.2023, 18:42 Titel: |
|
|
Vielleicht bleibt bei der Division ja wirklich kein Rest.
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 03.09.2023, 19:00 Titel: |
|
|
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](images/smiles/icon_neutral.gif) _________________ Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 03.09.2023, 20:33 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 03.09.2023, 20:38 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 04.09.2023, 19:30 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 04.09.2023, 20:02 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 05.09.2023, 12:11 Titel: |
|
|
@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 |
|
![](templates/subSilver/images/spacer.gif) |
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 91
|
Verfasst am: 05.09.2023, 19:20 Titel: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 06.09.2023, 09:42 Titel: |
|
|
Oha @hrr!
Das ist in der Tat mind. 50% schneller ! _________________ Umfangreichste Angaben zu Primzahl k-Tupel
https://www.pzktupel.de/ktuplets.php |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
pzktupel
![](images/avatars/7516772835f10bc2830124.png)
Anmeldungsdatum: 07.07.2020 Beiträge: 83
|
Verfasst am: 11.09.2023, 21:42 Titel: |
|
|
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
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 |
|
![](templates/subSilver/images/spacer.gif) |
|