Biderketarekiko alderantzizko modular

testwikitik
Nabigaziora joan Bilaketara joan

Biderketarekiko alderantzizko modularra aritmetika modularrareko eragiketa bat da. n zenbaki oso baten biderketarekiko alderantzizkoa modulu p beste m zenbaki oso bat da non:

mn1(modp),

hau da, mn biderketa 1-arekin kongruentea den (modulu p). m zenbakia n zenbakiaren alderantzizkoa modulu p dela horrela adierazten da:

n1m(modp).

Biderketarekiko alderantzizko modularra ez da beti existitzen. n-ren alderantzizko modularra existitzen da baldin eta soilik baldin n eta p elkarrekiko lehenak badira, hau da, zkh(n,p)=1 bada.

n zenbakiaren alderantzizkoa modulu n existitzen denean, orduan beste zenbaki bat n balioaz zatitzearen eragiketa (modulu p) defini daiteke; zenbaki bat n balioaz zatitzea n1 alderantzizko modularraz biderkatzea da. p zenbaki lehena bada, orduan zenbaki guztiak dira alderantzikagarriak, 0-a izan ezik.


Azalpena

Biderketaren alderantzizko modularra ez da bakarra. Normalean, n-ren alderantzizkotzat (modulu p) hartzen den m zenbakia aukera guztien artean txikiena den zenbaki arrunta izaten da.

Adibidea:

Demagun n=3 zenbakiaren alderantzizkoa modulu p=11 kalkulatu nahi dela,

m31(mod11).

mn1(modp) betetzen duen m zenbakia aurkitu nahi da, hau da,

3131(mod11)

beteko duena. Kongruentzia hori betetzen duen zenbaki arrunt txikiena 4 da (11 partizioko balioa da). Horrela egiazta daiteke:

4=31(mod11)431(mod11)121(mod11)

Esan bezala, m=4 ez da aukera bakarra, 4-ri 11-ren multiploak gehituz, hau da, 4+(11z), z, beste 31(mod11) balio posibleak lor daitezke. Horrela, {..., −18, −7, 15, 26, ...} multzoko balio guztietarako m31(mod11) betetzen da.


Kalkuluak

Euklidesen Algoritmo Hedatua

Euklidesen algoritmo hedatua erabiliz n-ren biderketarekiko alderantzikoa modulu p kalkula daiteke.

Esan dugunez, n-ren alderantzikoa modulu p

xn1(modp)

betetzen duen x zenbaki osoa da, p|xn1 betetzen da, hau da, p balioak xn1 zatitzen du. Hortaz,

k non xn1=kp.

Beste era batean idatzita:

xnkp=1.

Euklidesen algoritmo hedatuak ebazten duen problema, hain zuzen ere, hori da. n eta p zenbaki osoak izanik, zkh(n,p) zatitzaile komunetako handiena eta

xn+yp=zkh(n,p)

berdintza betetzen duten x eta y zenbaki osoak kalkula daitezke. Kasu honetan zkh(n,p)=1 aurrez ezarrita dator. Baldin zkh(n,p)1 bada, orduan n-ren alderantzikoa modulu p ez da existitzen.

|n|<p bada, algoritmoa O(log(p)2) denboran exekutatuko da.

Adibidea

n=117 eta p=244 izanik, 117-ren alderantzizkoa modulu 244 horrela kalkulatzen da. Hasteko, existitzen dela egiaztatu behar da, hau da, zkh(n,p)=1 dela. Horretarako, Euklidesen algoritmoa aplikatuko dugu. Ondoren, zkh(n,p) kalkulatzeko egindako eragiketetatik n1 lortuko dugu:

  1. |n|<p denez, p=qn+r idatz daiteke. Hau da, 244=2117+10. Hondarra askatuz: 10=2242117
  2. 117>10 denez, 117=1110+7. Hondarra askatuz: 7=1171110
  3. 10>7 denez, 10=17+3. Hondarra askatuz: 3=1017
  4. 7>3 denez, 7=23+1. Hondarra askatuz: 1=723
  5. 3>1 denez, 3=13+0. Hortaz, zkh(244,117)=1 betetzen denez, 244 eta 117 elkarrekiko lehenak dira eta ondorioz, bilatzen dugun alderantzizko modularra existitzen da.
  6. Koefizienteen kalkulurako abiapuntua 4. urratseko 1=723 adierazpena da. Ondorengo urratsetan aurreko urratsetako hondarren adierazpenak ordezkatu behar dira.
  7. 3. urratseko hondarra 6. urratseko ekuazioan txertatuz: 1=72(1017), hau da, 1=210+37.
  8. 2. urratseko hondarra 7. urratseko ekuazioan txertatuz: 1=210+3(1171110), hau da, 1=31173510.
  9. 1. urratseko hondarra 8. urratseko ekuazioan txertatuz: 1=311735(2442117), hau da, 1=35244+73117. Esan dezakegu n1=73 dela, 1=xn+kp ekuazioa kontuan hartuz.
  10. n1 negatiboa bada, n1-en alderantzizkoa n1+p izango da.


Erabilerak

Biderketarekiko alderantzizko modularrak erabilera ugari ditu algoritmoetan, zenbaki teoria-rekin erlazioa dutenetan bereziki, algoritmo horietako askoren oinarrian aritmetika modularraren teoria dagoelako.

Makina askok ez daukate zatiketa eragiketa egiteko hardware berezirik eta ondorioz, zatiketaren eragiketa biderketarena baino motelago exekutatzen da. Alderantzizko modularraren erabilerarekin kalkuluak azkarrago egitea lortzen da.

Inplementazioak

Inplementazioa C-n

//Calculador de inversos modulares (CIM), Arget-ek sortua
//Biderketarekiko alderantzizko modularraren kalkulua.
//Erabilera: cim a m
//(cim) programak (a * b)(mod m) = 1 betetzen duen b aurkituko du.
//Exekutatzean ez bada emaitzik itzultzen, ‘a’ balioak ez du alderantzizkorik modulu ‘m’.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    if(argc == 1)exit(-1);

    int b, // (a * b)(mod m)-n esprezioko b balioa gordeko da
        x, //eragiketaren emaitza gordeko da
        a = atoi(argv[1]), //a gorde
        m = atoi(argv[2]); //m gorde

    for(b = 0; b < m; b++)
    {
        x = (a * b) % m;
        if(x == 1)
            printf("%i", b);
    }
    return 0;
}

Inplementazioa Java-n

    //JLCY-k sortua,  (17-1-2016) 
    // Bezout-en lema aplikatuz
    //zkh(z,p) lortzen da euklidesen algoritmoa erabiliz
    //zkh(a,p)=1 bada, "a" eta "p" elkarrekiko lehenak dira; "a"-ren alderantzizkoa modulu "m" existitzen da.
    public void Inverso(int a,int m)
    {
        int c1=1,c2=-1*(m/a);//a-ren eta b-ren koefizienteak hurrenez hurren
        int t1=0,t2=1;
        int r=m%a;//hondarra
        int x=a,y=r,c;
        while(r!=0)
        {
        c= x/y;//zatidura
        r= x%y;//hondarra
        //koefizienteen aldi baterako balioak gordetzen dira
        c1*=-1*c;
        c2*=-1*c;
        //aurreko korritzea batzen da
        c1+=t1;
        c2+=t2;
        //korritzea eguneratzen da
        t1=-1*(c1-t1)/c;
        t2=-1*(c2-t2)/c;
        x=y;
        y=r;
        }
      if(x==1)//aurreko hondarra 1 bada, elkarrekiko lehenak dira eta alderantzizko existitzen da
            System.out.println(""+t2);
      else
            System.out.println("ez dago alderantzizkorik");
    }

Kanpo estekak

Txantiloi:Autoritate kontrola