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 | aldatu iturburu kodea]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 | aldatu iturburu kodea]Euklidesen Algoritmo Hedatua
[aldatu | aldatu iturburu kodea]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:
- denez, idatz daiteke. Hau da, . Hondarra askatuz:
- denez, . Hondarra askatuz:
- denez, . Hondarra askatuz:
- denez, . Hondarra askatuz:
- denez, . Hortaz, betetzen denez, eta elkarrekiko lehenak dira eta ondorioz, bilatzen dugun alderantzizko modularra existitzen da.
- Koefizienteen kalkulurako abiapuntua 4. urratseko adierazpena da. Ondorengo urratsetan aurreko urratsetako hondarren adierazpenak ordezkatu behar dira.
- 3. urratseko hondarra 6. urratseko ekuazioan txertatuz: , hau da, .
- 2. urratseko hondarra 7. urratseko ekuazioan txertatuz: , hau da, .
- 1. urratseko hondarra 8. urratseko ekuazioan txertatuz: , hau da, . Esan dezakegu dela, ekuazioa kontuan hartuz.
- negatiboa bada, -en alderantzizkoa izango da.
Erabilerak
[aldatu | aldatu iturburu kodea]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 | aldatu iturburu kodea]Inplementazioa C-n
[aldatu | aldatu iturburu kodea]//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 | aldatu iturburu kodea] //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");
}