Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 9. 11. 2015 21:31:05

Drnda
Člen
Registrace: 9. 11. 2015
Příspěvků: 3

pokusy a chyby s operatorem Modulo - VYŘEŠENO

Takže znovu a lépe smile
V diskusi pod článkem jsem uváděl ze se nemohu s funkcí MOD() modulo dobrat spravneho vysledku u diffie-hellman vzorce na vymenu klice, uvedl jsem ale omylem špatný příklad který nahodou calc vypočítal správně. Proto bych to rád napravil i s ukázkami a .ods souborem ke stažení

Jedná se LO Calc 5.0.3.2
tak například:
calc říka ze MOD(22^25;116) = 28, wolframalpha dá správný výsledek 64 http://www.wolframalpha.com/input/?i=22^25+modulo+116
calc říka ze MOD(22^30;116) = 16, wolframalpha dá správný výsledek 20 http://www.wolframalpha.com/input/?i=22^30+modulo+116


Podle informací od čtenáře "neutr" jsem na rozpacích jestli bych neměl sešit donutit přejít do nějakeho jiného režimu, ale nevím jak. Pro úplnost ještě nahraju i celý sešit, snad to nějak pomůže. Je sice zajímavé že jsou i případy kdy se společný D-H klíč vzácně shoduje jako např. když se použijí g=22, p=116, a=3, b=6. No a to je na tom to zajimave že mi není známo kde se ztrácí calc, nebo kde jsem to já kdo porušil nejaky maximálni rozsah nebo pravidlo calcu.


neutr napsal(a)

...
2. Číslo =82^7 (= 24928547056768) ještě spadá do rozsahu Long Integer. To znamená že je menší nežli =2^1024 (Od tohoto rozsahu -včetně- už počítač není schopen počítat. Vyhodí #NUM).

3. Výpočty probíhají pomocí lg - přirozeného logaritmu se základem "e" 2,71... což znamená, že zde vzniká nepřesnost v podílu. V sešitě je funkce LN() což je přirozený logaritmus. Jeho opakem je funkce EXP(). tato funkce pracuje s formátem čísla Double.
...

Editoval Drnda (10. 11. 2015 13:49:45)

Offline

#2 9. 11. 2015 23:13:43

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

22^25 = 3635524038174209847159494312722432

Calc ale počítá na 16 platných číslic (zobrazuje 15)
22^25 = 3635524038174210000000000000000000
zbývající čísla zahodí.

Bohužel není to chyba ale vlastnost.

Offline

#3 10. 11. 2015 06:25:03

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,465

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

Donutit Calc aby počítal s větší přesností je obtížné, ale jde to. Svého času jsem podobný problém řešil. Jednalo se o faktoriály. Omezení Calcu - faktoriál čísla > 170 = #NUM (přetečení). Já jsem "zatím" našel 2 metody jak to obejít, ale žádná sláva. V rámci maker jsem řešil ještě další možnost.
     Tento postup je "neprovádění" plného součinu. Hodí se to jen k určitým operacím které nějak souvisí s iteracemi. Abych to moc nerozváděl : Pomocný list kde vyjádřím činitele součinu jako sloupec ze kterého ubírám, nebo do něj přidávám. Inkremetuji, nebo dekremenzuji na nějaké rozumné velikosti a její násobky jsou ve sloupci. Takto jsem to také testoval ale pro ostrý provoz jsem generoval místo listu sešitu modul Basicu.


     Jinou cestou je použít simulaci součinu (podílu) mnohočlenu. Tedy rozebrat do jednotlivých buněk dílčí součiny, nebo podíly. Podobně to děláme když násobíme, nebo dělíme na papíru velká čísla tedy pod sebe. To lze udělat v sešitě také "vedle sebe". Další operace jsou sice zkomplikovány, ale pro modulo a podobné jednoduché zadání to asi stačí. Zobrazení můžeme udělat v jedné buňce jen jako textový řetězec. Pro Vaše účely bych doporučil právě toto.


     Další cestou je použití logaritmů. Ty byly právě kvůli podobným potížím vynalezeny nejméně v 16. století na dvoře Rudolfa II švýcarským matematikem (jméno mi vypadlo). Je ale možné, že se k takovým účelům používal i algoritmus Gelosia.
     Hledal jsem na internetu a našel jsoem stránku kde bylo možné vygenerovat faktoriál až 2^40000. Já jsem testoval jenom pro zajímavost Calc. Pomocí logaritmu lze obsluhovat ještě čísla do 2^3000 pak ale prostý logaritmus se základem "e" také klekne. Je sice možné vytvořit logaritmus s jiným základem, nebo logaritmovat logaritmy ap, to jsem ale netestoval.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 10. 11. 2015 10:46:15

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

Proč vymýšlet znovu trakař.

V případě modula platí jednoduché:

ab mod m = ((a mod m)*(b mod m)) mod m

Předpokládám, že pokud se Drnda problematice věnuje, tak elementární vztahy zná.


=MOD(MOD(22^10;116)*MOD(22^10;116)*MOD(22^5;116);116) = 64
=MOD(MOD(22^10;116)*MOD(22^10;116)*MOD(22^10;116);116) = 20

Editoval lp. (10. 11. 2015 10:55:46)

Offline

#5 10. 11. 2015 13:46:05

Drnda
Člen
Registrace: 9. 11. 2015
Příspěvků: 3

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

Tak co se tyce calcu a zminene problematice, tak tato astronomicka cisla zkousim uplne poprve a az diky vam jsem se dozvedel o nejakych 16bit limitech ciselne presnosti. Proto diky všem za info a pomoc.


PS: neni vam znamo zda existuje nejake rozsireni (extensions) ktere by snad tuto limitaci zvedalo?

Offline

#6 10. 11. 2015 15:27:59

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

O doplňku nevím.

Pokud někdy něco podobného zkouším, použiju bc.

Offline

#7 10. 11. 2015 16:21:29

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

Zkus makro:

Function BigMod(A As Long, B As Long, C As Long) As Long
    Dim X As Long
    X = A mod C
    While B > 1 
        X = ((A mod C) * X) mod C
        B = B - 1
    Wend
    BigMod = X
End Function

Zavoláš jej =BigMod(A;B;C) místo =mod(A^B;C)


Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#8 10. 11. 2015 23:17:03

Drnda
Člen
Registrace: 9. 11. 2015
Příspěvků: 3

Re: pokusy a chyby s operatorem Modulo - VYŘEŠENO

Tak tohle je geniální a funkční smile
děkuju

LADER napsal(a)

Zkus makro:

Function BigMod(A As Long, B As Long, C As Long) As Long
    Dim X As Long
    X = A mod C
    While B > 1 
        X = ((A mod C) * X) mod C
        B = B - 1
    Wend
    BigMod = X
End Function

Zavoláš jej =BigMod(A;B;C) místo =mod(A^B;C)

Offline

Zápatí