Clever-Excel-Forum

Normale Version: Mod/Rest in VBA oder Formel
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hey Leute, ich habe versucht mit der Rest und Potenz Funktion Modulo zu berechnen leider ohne Erfolg. Bei mir steht nur #Zahl.

Die Aufgabe lautet:

348^15 mod 1357

Das Ergebnis ist 725.

Hat jemand ne VBA oder Formel Lösung ?

Danke euch trotzdem für alle Tipps
Hi,

die Zahl ist zu groß für Excel.
Hallo,

1357 ist keine Primzahl, sondern 23 * 59. Damit kann man (paper/pencil) die Zahl 348^15 solange kürzen, bis sie in Xl berechenbar wird.

mfg

(Frage:

- wöfür wird das benötigt
- wenn man die Zahlen als Text nutzt, kann man auch mit mehr als 12 Stellen rechnen
)
Hallo,

es gibt eine Zerlegung in eine iterative Formel:


Code:
https://stackoverflow.com/questions/2177781/how-to-calculate-modulus-of-large-numbers

"'348^15 mod 1357

Das Ergebnis ist 725."            
            
            
1    348    348    '=REST(A4*B4;1357)
348    348    331    
331    348    1200    
1200    348    1001    
1001    348    956    
956    348    223    
223    348    255    
255    348    535    
535    348    271    
271    348    675    
675    348    139    
139    348    877    
877    348    1228    
1228    348    1246    
1246    348    725


15 x 348 in Spalte B eintragen, in C den Modulo. In Spalte A der nächsten Reihen wird der Modulo übernomen.

mfg
(19.01.2018, 09:00)Fennek schrieb: [ -> ]- wenn man die Zahlen als Text nutzt, kann man auch mit mehr als 12 Stellen rechnen

Wohl wahr!
(es sind mehr als 12 Stellen (Excel schafft ja schon 15), nämlich 28)
CDec() ist das Zauberwort.

Gruß Ralf
Hi Ralf,

(19.01.2018, 20:07)RPP63 schrieb: [ -> ]CDec() ist das Zauberwort.

und wie genau?

Debug.Print CDec(CDec(CDec("348") ^ CDec("15")) Mod CDec("1357"))

geht nicht.  Undecided

Gruß Uwe
Moin Uwe!

CDec() bezog sich nur auf die mögliche Rechengenauigkeit von 28 Stellen.
Als Beispiel das Schachbrett, auf dem die Anzahl der Reiskörner, mit 1 beginnend, auf jedem Feld verdoppelt wird.
Excel errechnet das falsche:
A
1falsche Zahl
218.446.744.073.709.600.000

ZelleFormel
A2=2^64-1

Mit dem Umweg folgender UDF:
Function Schachbrett() As String
Dim tmpPotenz As Variant
tmpPotenz = CDec(2 ^ 32)
Schachbrett = Format(CStr(CDec(tmpPotenz * tmpPotenz) - 1), "###,###,###,###,###,###,###")
End Function

kann Excel die Pleite des Königs veranschaulichen:
A
4korrekte Zahl
518.446.744.073.709.551.615

ZelleFormel
A5=schachbrett()

Das hiesige Problem ist ja ein ganz anderes!
Der Modulo-Operator erwartet als Ganzzahl (Dezimalzahlen werden gerundet) einen Long
Dieser ist bereits ab 348^4 überschritten und erzeugt deshalb den Überlauf.

Eine Möglichkeit in Excel ist das von Fennek vorgestellte Gleichungssystem.
Ich bevorzuge bei so etwas zunächst mal Calc.exe  :21:
Der jedem Windows-Nutzer bereitgestellte Rechner kommt damit nämlich problemlos klar!

[attachment=15649]

Gruß Ralf
Und da mich das Problem interessiert, habe ich auf Basis von stackoverflow eine UDF geschrieben:

Function BigModulo&(Basis&, Exponent&, ModOp&)
Dim i&
BigModulo = 1
For i = 1 To Exponent
  BigModulo = (BigModulo * Basis) Mod ModOp
Next
End Function

Lösung dann entweder per aufrufendem Makro:

Sub Modulo()
   MsgBox BigModulo(348, 15, 1357)
End Sub

oder direkt in einem Tabellenblatt:

ABCD
1BasisExponentModOpErgebnis
2348151357725

ZelleFormel
D2=BigModulo(A2;B2;C2)