Biderketarekiko alderantzizko modular

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

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

Biderketarekiko alderantzizko modularra ez da beti existitzen. -ren alderantzizko modularra existitzen da baldin eta soilik baldin eta elkarrekiko lehenak badira, hau da, bada.

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


Azalpena aldatu

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

Adibidea:

Demagun   zenbakiaren alderantzizkoa modulu   kalkulatu nahi dela,

 .

  betetzen duen   zenbakia aurkitu nahi da, hau da,

 

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

 

Esan bezala,   ez da aukera bakarra,  -ri  -ren multiploak gehituz, hau da,   beste   balio posibleak lor daitezke. Horrela, {..., −18, −7, 15, 26, ...} multzoko balio guztietarako   betetzen da.


Kalkuluak aldatu

Euklidesen Algoritmo Hedatua aldatu

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

Esan dugunez,  -ren alderantzikoa modulu  

 

betetzen duen   zenbaki osoa da,   betetzen da, hau da,   balioak   zatitzen du. Hortaz,

  non  

Beste era batean idatzita:

 

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

 

berdintza betetzen duten   eta   zenbaki osoak kalkula daitezke. Kasu honetan   aurrez ezarrita dator. Baldin   bada, orduan  -ren alderantzikoa modulu   ez da existitzen.

  bada, algoritmoa   denboran exekutatuko da.

Adibidea

  eta   izanik,  -ren alderantzizkoa modulu   horrela kalkulatzen da. Hasteko, existitzen dela egiaztatu behar da, hau da,   dela. Horretarako, Euklidesen algoritmoa aplikatuko dugu. Ondoren,   kalkulatzeko egindako eragiketetatik   lortuko dugu:

  1.   denez,   idatz daiteke. Hau da,  . Hondarra askatuz:  
  2.   denez,  . Hondarra askatuz:  
  3.   denez,  . Hondarra askatuz:  
  4.   denez,  . Hondarra askatuz:  
  5.   denez,  . Hortaz,   betetzen denez,   eta   elkarrekiko lehenak dira eta ondorioz, bilatzen dugun alderantzizko modularra existitzen da.
  6. Koefizienteen kalkulurako abiapuntua 4. urratseko   adierazpena da. Ondorengo urratsetan aurreko urratsetako hondarren adierazpenak ordezkatu behar dira.
  7. 3. urratseko hondarra 6. urratseko ekuazioan txertatuz:  , hau da,  .
  8. 2. urratseko hondarra 7. urratseko ekuazioan txertatuz:  , hau da,  .
  9. 1. urratseko hondarra 8. urratseko ekuazioan txertatuz:  , hau da,  . Esan dezakegu   dela,   ekuazioa kontuan hartuz.
  10.   negatiboa bada,  -en alderantzizkoa   izango da.


Erabilerak aldatu

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 aldatu

Inplementazioa C-n aldatu

//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 aldatu

    //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 aldatu