Lang aritmetik - aritmetiske operationer udført ved hjælp af en computer ( addition , subtraktion , multiplikation , division , eksponentiering , elementære funktioner ) på tal, hvis bitdybde overstiger længden af maskinordet på denne computer. Disse operationer implementeres ikke i hardware, men i software, ved at bruge den grundlæggende hardware til at arbejde med antallet af lavere ordrer. Et særligt tilfælde - arbitrær præcisionsaritmetik - refererer til aritmetik, hvor længden af tal kun er begrænset af mængden af tilgængelig hukommelse.
Lang aritmetik bruges på følgende områder:
Strengt taget kræves kun indirekte adressering fra processoren for at implementere aritmetik med vilkårlig præcision ; i aritmetik med fast præcision kan du endda undvære det. Visse processorfunktioner fremskynder dog lang aritmetik, mens de forenkler programmeringen.
Programmeringssprog har indbyggede datatyper, der generelt ikke overstiger 64 bit (ca. 10 19 ). Decimal lang aritmetik blev implementeret i de sovjetiske programmeringssprog ALMIR-65 på MIR-1- computeren og ANALYTIK på MIR-2- computeren . For at arbejde med store tal er der i moderne programmeringssprog en del færdige optimerede biblioteker til lang aritmetik.
De fleste funktionelle sprog giver dig mulighed for at skifte fra almindelig aritmetik til lang aritmetik uden at skulle ændre den aritmetiske kode. For eksempel repræsenterer Erlang og Scheme altid nøjagtige tal så lange. I Standard ML bestemmes implementeringer af alle varianter af heltal baseret på signaturen INTEGER, hvilket giver dig mulighed for at vælge den nødvendige dimension, inklusive et modul IntInf, der implementerer heltal med vilkårlig præcision; PolyML-implementeringen bruger dette modul som standard.
Der er indbyggede biblioteker til at arbejde med store tal i PascalABC.NET, Ruby , Python og Java .
Følgende repræsentation af heltal bruges normalt til at beskrive algoritmer. Basen er valgt . Så kan længdeheltallet repræsenteres som [1] :
hvor
GrundlæggendeDet er en algoritme efter skolemetoden "i en kolonne". Det tager tid, hvor er størrelserne af de gangede tal.
Algoritmen kan repræsenteres som [1] [2] :
Algoritme 1 BasecaseMultiply
Input: Output: for fra at gøre
Karatsubas multiplikationsmetode hører til " del og hersk " paradigmet. Beregningsmæssig kompleksitet af algoritmen:
.Denne algoritme er en simpel implementering [3] af ideen om at opdele inputdata, som er blevet grundlaget for algoritmerne anført nedenfor. Ideen er at opdele en multiplikationsoperation på cifrede tal i tre multiplikationsoperationer på tal med længde plus [1] .
For at gange to tal større end et maskinord kaldes Karatsubas algoritme rekursivt, indtil tallene er små nok til at blive ganget direkte. Et eksempel på en sådan algoritme:
Algoritme 2 KaratsubaMultiply
Input: Output: KaratsubaMultiply KaratsubaMultiply KaratsubaMultiply
Lad os tælle :
Tre mellemliggende koefficienter skal beregnes:
Resultat:
Toomas algoritmeDenne algoritme er en generalisering af Karatsuba-algoritmen og er hurtigere. Givet to heltal og , opdeler Tooms algoritme dem i mindre dele, som hver er lig med længden af et maskinord, og udfører operationer på disse dele. Beregningskompleksitet af algoritmen:
Tooma-3 algoritmeIdeen blev første gang foreslået af A. L. Toom i 1963 [4] , og består i at dele inputdataene (multiplikatorerne) i 3 lige store dele (for nemheds skyld betragtes alle dele som lige). Toom-3 reducerer antallet af elementære multiplikationsoperationer fra 9 til 5. Algoritmekompleksitet
Overvej denne algoritme i det følgende eksempel. Lad der være to tal og . Lad operationer defineres på tal, hvis størrelse er lig med 1/3 af størrelsen af de oprindelige tal (se figur). Vi antager også, at tallene optager lige stor hukommelse og er delelige med nøjagtigt 3 dele, ellers vil vi udfylde begge tal med nuller til den ønskede størrelse.
Derefter er der en afbildning (parametrisering) af disse dele til polynomier af 2. grad.
Lad os per definition introducere sådan, at værdierne af polynomierne er henholdsvis lig med inputtallene og . For en bitvis repræsentation af tal er dette tal to i potens lig med længden af hver del i bit.
Vi introducerer også et polynomium:
(en)Efter at elementerne er bestemt - koefficienterne for polynomiet , vil de blive brugt for at opnå , da . Størrelsen af koefficienterne er 2 gange større (fra hukommelsen) end partitionen eller . Det endelige tal svarende til produktet kan findes ved at tilføje med et skift, som vist i figuren nedenfor.
Koefficienterne kan beregnes som følger: og så videre, men dette vil kræve alle 9 multiplikationer: for i, j=0,1,2, og vil svare til en simpel multiplikation.
I stedet valgte man en anden tilgang. beregnes i (1) ved 5 point for forskellige .
Tabellen nedenfor viser værdierne af polynomierne i ligning (1)
Parameteren er betinget. Det betyder den banale lighed af koefficienterne ved , så vi får værdien med det samme. Dette system er lineært i 5 ubekendte. Når det er løst, får vi ubekendte . Dernæst får vi værdien af polynomiet, som beskrevet ovenfor.
Tooma-4 algoritmeAlgoritmens kompleksitet Repræsenterer 7 elementære multiplikationsoperationer. Toom-4 opdeler inputtet i 4 dele.
Efter samme princip som i Toom-3 bygger vi to polynomier:
og beregnes ved 7 forskellige punkter, beregnes værdien på disse punkter også.
hvorfra vi straks kommer | |
hvorfra vi straks kommer |
Antallet af additions- og multiplikationsoperationer for Toom-4 er meget større end for Toom-3. Men nogle udtryk forekommer mere end én gang. For eksempel beregnet for og for [5] .
Tooms algoritme for en vilkårlig partitionTooms algoritme til at opdele inputtal i n operander svarer til den, der er beskrevet ovenfor. Generelt resulterer opdeling af to lige lange operander i dele i beregningen af prikværdier . Som point for løsning af systemet tager de normalt .
Fourier multiplikationDenne multiplikationsalgoritme bruges til store og meget store tal [6] .
Denne algoritme multiplicerer to tal i tid, hvor er antallet af signifikante cifre i de multiplicerede tal (forudsat at de er ens). Skabelsen tilskrives Cooley (Coolet) og Tyuki (Tukey) - 1965. Der er også forslag om, at denne algoritme var kendt før, men ikke var af stor betydning, før de første computere blev opfundet. Sandsynlige kandidater til forfatterskabet af opfindelsen af denne algoritme kaldes også Runge (Runge) og Koenig (Konig) - 1924, såvel som Gauss - 1805.
Lad der være et tal, vi repræsenterer det som et polynomium, som vi gjorde tidligere. Lad os kalde dette polynomium Vi introducerer også den diskrete Fourier-transformation af polynomiet som en vektor , med koordinater . Hvor er defineret som - den komplekse rod af den th grad af 1, ikke lig med 1. Faktum er, at den komplekse rod af 1 er defineret op til en fasefaktor, antallet af disse rødder er . Fouriertransformationen anvendes for at erstatte foldningen af polynomiernes koefficienter og : - med produktet af deres Fourierbilleder.
hvor multiplikation betyder skalarproduktet af vektorer.
Antag, at der er en potens af to.
Finding sker rekursivt (del og hersk). Ideen er at opdele det oprindelige polynomium i to polynomier,
Så .
Bemærk, at blandt alle numre kun forskellige. Derfor vil DFT være -element. Og da DFT består af elementer, så vil den komplekse rod af 1 der være roden af graden .
Midler,
hvor og
Vi brugte egenskaberne ved komplekse tal: forskellige rødder af graden af alting . .
Vi får en rekursiv algoritme:
DFT for et element er lig med dette element
for at finde DFT A, vi deler koefficienterne A i lige og ulige, vi får to polynomier , og vi finder DFT for dem, vi finder DFT :
for .
Der er bevis for følgende udsagn: Den inverse DFT findes på samme måde som den direkte DFT, bortset fra at punkterne tages som punkter, der er symmetriske om den reelle akse, i stedet for dem, der bruges i den direkte DFT-transformation. Det er også nødvendigt at dividere alle polynomiets koefficienter med n
En af kvadratrodsalgoritmerne er Karatsuba Square Root-algoritmen. Dette er langt den bedst kendte metode til at beregne kvadratroden af et n -cifret tal. Denne algoritme bruger den hurtige Fourier-transformation og Newtons metode med kompleksitet 5 M ( n ) [7] .
Den præsenterede algoritme er baseret på opdelingen af Burnickel-Ziegler (Burnikel-Ziegler) Karatsuba. Givet et heltal n beregner algoritmen samtidig sin heltal kvadratrod og den tilsvarende rest, som er Dette er ikke asymptotisk optimalt, men meget effektivt i praksis med rækkefølge af operationer kompleksitet, hvor K ( n ) er antallet af operationer, der kræves for at multiplicere to n - bit-tal ved hjælp af Karatsuba-algoritmen. Årsagen til denne lave kompleksitet er den smukke Karatsuba-afdeling, der for nylig blev opdaget af Burnickel og Ziegler, og den omhyggelige håndtering af rester, der undgår unødvendige beregninger.
Sætning . Antallet af operationer, som SqrtRem-algoritmen bruger med en 2n - bit input, er begrænset
hvor K ( n ) er antallet af operationer, der kræves for at multiplicere 2 n -bit tal ved hjælp af Karatsubas algoritme.
Algoritme SqrtRem Input: med Output: sådan, at hvis derefter returnereAntag, at du konverterer fra grundtal b til grundtal B [8] .
Måder at konvertere heltal
Metode 1 (Division med B ved hjælp af grundtal b repræsentation af tal). For et givet heltal u kan man
opnå en repræsentation i basis B-format af formen ved at gøre
Metode 2 (Multiplikation med B ved brug af base b-repræsentation). Hvis repræsentationen af tallet u i grundtallet b har formen , kan du ved hjælp af aritmetiske operationer med tal, der er repræsenteret i formatet i grundtallet B, få et polynomium på formen
(( .
Metode 1 (a) (Multiplikation med b ved hjælp af basis B-repræsentation af tal). For et givet brøktal og du kan beregne værdierne af cifrene i dets repræsentation i basis B som følger:
, , ,... hvor {x} betyder xmod1 = x- . For at afrunde resultatet til M cifre kan beregningen afbrydes efter modtagelse af , og hvis {...{{uВ}В}...В} er større end 1/2, så skal værdien øges med én. (Bemærk dog, at denne operation kan føre til behovet for at udføre oversættelser, som bør inkluderes i resultatet ved hjælp af aritmetiske operationer i basis B. Det ville være nemmere at tilføje en konstant til det oprindelige tal u, før du starter beregningerne , men dette kan føre til et forkert resultat, hvis tallet i en computer ikke kan repræsenteres nøjagtigt i basis b-format Bemærk også, at det er muligt at afrunde resultatet til if ).
Metode 2 (a) (Multiplikation med B ved brug af base b-repræsentation). Hvis repræsentationen af et tal og i grundtal b har formen , så ved hjælp af aritmetiske operationer med tal, der er præsenteret i formatet i grundtal B, kan du få et polynomium på formen
((… + …) + .
Metode 1 (b) (Multiplikation med b ved brug af basis B-repræsentation af tal). For et givet brøktal u kan du beregne værdierne af bits af dets repræsentation i basis B som følger:
, , ,... hvor {x} betyder xmod1 = x- . For at afrunde resultatet til M cifre kan beregningen afbrydes efter modtagelse af , og hvis {...{{uВ}В}...В} er større end 1/2, så skal værdien øges med én. (Bemærk dog, at denne operation kan føre til behovet for at udføre oversættelser, som bør inkluderes i resultatet ved hjælp af aritmetiske operationer i basis B. Det ville være nemmere at tilføje en konstant til det oprindelige tal u, før du starter beregningerne , men dette kan føre til et forkert resultat, hvis tallet i en computer ikke kan repræsenteres nøjagtigt i basis b-format Bemærk også, at det er muligt at afrunde resultatet til if ).
Metode 2 (b) (Division med b ved hjælp af grund B-repræsentation af tal). Hvis tallet u er repræsenteret i grundtallet b som , så ved hjælp af aritmetiske operationer i grundtallet B, kan det beregnes som
. Det er nødvendigt omhyggeligt at overvåge de fejl, der opstår ved trunkering eller afrunding under divisionsoperationen med b; de er normalt ubetydelige, men det er ikke altid tilfældet.
Det er mest bekvemt at begynde at konvertere meget lange tal ved at konvertere blokke af bit, som kan udføres med enkelt præcision. Du kombinerer derefter disse blokke ved hjælp af simple metoder, der er specifikke for multipel præcision. Lad f.eks. 10n være den højeste potens af 10 mindre end maskinordstørrelsen. Derefter:
a) for at konvertere et heltal "Tal med multiple præcision fra binært til decimaltal, er det nødvendigt at gange det med 10n (altså konvertere fra binært til decimaltal med grundtal 10n ved hjælp af metode 1, a); ved at bruge operationer med en enkelt præcision, vi får n decimaler for hver repræsentationsenhed i grundtallet 10n;
b) for at konvertere brøkdelen "Del af et tal med flere præcision fra binært til decimaltal, fortsæt på lignende måde ved at gange det med : (dvs. ved at bruge metode 2, a, hvor B \u003d 10n);
c) for at konvertere et heltal med multiple præcision fra decimal til binær, konverterer vi først blokke af n bit; derefter, for at konvertere fra basis 10n til binær, brug metode 1, b;
d) For at konvertere en brøkdel med flere præcision fra decimal til binær skal du først konvertere til grundtal 10n som i procedure (c) og derefter bruge metode 2, b.
Algoritmen til at dividere et n-bit tal u med et n-bit tal v skal resultere i to n-bit tal - u mod v og u div v. Algoritmerne beskrevet nedenfor er ikke anvendelige i praksis, da de finder et reelt tal, og ikke to n-bit tal, resultatet af division.
I teorien, for at dividere et n-bit tal u med et n-bit tal v, kan du først finde en n-bit tilnærmelse til tallet 1/v, derefter gange det med u, hvilket vil give en tilnærmelse til , og til sidst udfør endnu en multiplikation for at lave en lille korrektion for at sikre, at uligheden holder . Baseret på det foregående er det nok at have en effektiv algoritme, der ud fra et givet n-bit tal ville danne en omtrentlig værdi af det tal, der er den inverse af et n-bit tal. Anvend derefter algoritmen til at multiplicere n-bit tal. [9]
Algoritme R (Opnåelse af den reciproke med høj præcision) Lad tallet v har en binær repræsentation , hvor . Denne algoritme beregner en tilnærmelse z af tallet , således at
.
R1 (Oprindeligt gæt) Tildel og .
R2 (Newton Iteration) Her har vi tallet z i binær form med fortegn efter delepunktet og . Beregn nøjagtigt ved hjælp af det hurtige multiplikationsprogram . Beregn derefter præcis hvor . Derefter tildele , hvor , som opfylder uligheden , tilføjes efter behov for at afrunde , så det er et multiplum af . Og til sidst tildele .
R3 Hvis , så vend tilbage til trin R2; ellers slutter udførelsen af algoritmen.
Datatyper | |
---|---|
Ufortolkelig | |
Numerisk | |
Tekst | |
Reference | |
Sammensatte | |
abstrakt | |
Andet | |
relaterede emner |