Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Mod/Rest in VBA oder Formel
#1
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
Antworten Top
#2
Hi,

die Zahl ist zu groß für Excel.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#3
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
)
Antworten Top
#4
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
Antworten Top
#5
(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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#6
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
Antworten Top
#7
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!

   

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Kuwer
Antworten Top
#8
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)
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 2 Nutzer sagen Danke an RPP63 für diesen Beitrag:
  • Kuwer, Fennek
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste