Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 21. 01. 2012 17:03 — Editoval centaurian (21. 01. 2012 17:05)

centaurian
Zelenáč
Příspěvky: 1
Reputace:   
 

Dělení velkých čísel

Zdravím.
Řeším problém ohledně dělení:

1) konkrétně:

Potřebuji vydělit 2 čísla v assembleru.
dělenec: reprezentován 3bajty (24bitů), maximální hodnota 255*dělitel
dělitel:   reprezentován 2bajty (16bitů), maximální hodnota 320
podíl se tedy vždy vejde do 1 bajtu (8bitů) (maximální hodnota 255)
Mám operaci DIV (tj. operátor celočíselného dělení), který ovšem umí podělit jen 2bajtové číslo jednobajtovým a výsledek pak uloží do jednoho bajtu.

2) obecně:
mám například číslo 387, které chci vydělit číslem 43 (výsledek je jednociferný = 9). Mám ovšem k dispozici pouze kalkulačku, která umí dělit pouze dvouciferné číslo jednociferným tj. např. provést výpočet 25/5=5.
(dále umí násobit, sčítat a odečítat libovolná čísla).

Offline

 

#2 09. 08. 2012 20:38 — Editoval j3n6 (16. 09. 2012 02:53)

j3n6
Zelenáč
Místo: Praha 6 Břevnov
Příspěvky: 4
Reputace:   
Web
 

Re: Dělení velkých čísel

↑ centaurian:

                      -> neuveden typ assembleru;
Takhle pro Borland:

Maximální číslo v hex nebo dekadicky:
              local integer 32, tedy l_i32_:   
               __int32 l_i32__re =    0x7FFFFFFF;          // 2415919103
Nějaké prvočíslo:
               __int32 l_i32__im =  2417;

Výsledek do:
               __int32 l_i32_ret =      0;
Modulo výsledku do:
               __int32 l_i32_edx =     0;


_asm  {
      push ecx
      mov  edx, 0
      mov  eax, l_i32__re                 // dělenec                                                   do registru eax
      mov  ecx, l_i32__im                 // dělitel                                                     do registru ecx
      div  ecx                                   // vydělíš

      mov l_i32_ret,  eax                  // celé číslo do l_i32_ret ( return )                 z registru eax
      mov l_i32_edx,  edx                 //  celočíselný zbytek po dělení   ( modulo )   z registru edx
      pop ecx
   };
 
     a třeba vypsat do Editu.
                Edit->Text =  l_i32_edx;

//----------------------------------------- 13.9.2012 -------------------------------------------------------------
Vyvinul jsem matetatický engine ( program) na dělení libovolně velkých čísel,  E ( exa) tedy e^18, deset na osmnástou v jednom kroku. Je prvotně určen na penetraci RSA metodou reverzní faktorizace prvočísla pomocí #include valarray z  C++ STL.
"Prague Pie - Pražský koláč." na http://large-numbers-division.org/

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson