Lampiran 1 Daftar Polinomial Primitif
Polinomial primitif diimplementasikan pada program dalam lampiran 3 dan 7. Polinomial ini disimpan dalam array. Input integer ? adalah representasi vektor terner untuk ?? . Misalkan kita input ? ? ? ?, maka output yang dihasilkan adalah [2,3,0,4].
Tabel 27 Daftar polinomial primitif ? ? ??? ?
?? Polinomial Primitif ?? Polinomial Primitif
2 x2 + x +2 34 x34 + x4 +2x +2 3 x3 + 3x + 2 35 x35 + x3 + x2 +3x +2 4 x4 + x3 + 3x + 2 36 x36 + x3 +3x +2 5 x5 + 4x + 2 37 x37 + x2 + 3x +2 6 x6 + x + 2 38 x38 + x3 + 3x2 +x +2 7 x7 + 3x +2 39 x39 + 2x3 + 3x + 2 8 x8 + x2 + 2x +3 40 x40 + x3 + x2 +3x +3 9 x9 + x2 + 2x +3 41 x41 + 4x3 +2 10 x10 + x2 + x +3 42 x42 + x3 + 3x2 +x +2 11 x11 + 3x +2 43 x43 + 3x + 2 12 x12 + x3 + 3x +3 44 x44 +2x4 + x3 +x2 +3x +3 13 x13 + x3 + 3x + 2 45 x45 + 2x2 +2x +2 14 x14 + x3 + x2 +2x + 2 46 x46 +x4 + 2x3 +x2 +3 15 x15 + x2 +2 47 x47 + x4 +x3 +x2 +2 16 x16 + x3 + 3x +2 48 x48 + 2a17 + 1 17 x17 + 2x2 +2x +2 49 x49 +x3 + x2 +4x +2 18 x18 + x4 + 2x +2 50 x50 + x4 +x3 +2x2 +3 19 x19 + x3 + 2x +2 51 x51 + x3 +x2 +3 20 x20 + x2 +2x +3 52 x52 + x4 + x3 +x2 +2x +3 21 x21 + 4x +2 53 x53 + 2x3 + 2x2 +x +3 22 x22 + x2 +x +3 54 x54 + x3 +x2 +x +3 23 x23 + x2 +4x +3 55 x55 + 3x3 + x + 2 24 x24 + x3 + x2 +x +2 56 x56 + x3 +x2 +x +3 25 x25 + 2x3 +3x +2 57 x57 + 4x +2 26 x26 + x3 + x2 +2x +2 58 x58 + x4 + 2x2 +2x +2 27 x27 + 4x + 2 59 x59 + x3 +2x2 +x +3 28 29 30 31 32 33 x28 + x3 +2x +3 x29 + x3 + x2 +3 x30 +x4 + 2x2 +x +3 x31 + 3x + 2 x32 + x3 + x2 +4x +2 x33 + 2x2 +2x +2 60 61 62 63 64 65 x60 + x3 +x2 +3x +3 x61 +x2 +2x +3 x62 + x4 + x3+x2 +x +2 x63 +x2 +2 x64 + 2x4 + x3 +3x2 +4x +3 x65 + 3x3 +x2 +x +2
Lampiran 2 Program Sistem Aritmetik Finite field ? ? ??? ?
Program aritmetika pada finite field ? ? ??? ? adalah pendukung pada program solusi masalah logaritma diskret pada ? ? ??? ?? (Lampiran 7). Program ini mengacu pada tulisan Ahmadi 2009. Implementasi program menggunakan software Maple 11. Misalkan ? ?? ? ? ?? ? ? ?? ? ?? ? ? ?? ? ? , ditulis [4, 0, 2, 1, 3, 1].
Program 3.1 Mengubah Vektor Penta ke Desimal
Deskripsi : UbahPenKeDes adala h prosedur mengubah vektor penta ke desimal dari order rendah ke order tinggi.
Input : vektor penta. Output : integer.
UbahPenKeDes := proc( N::list )
local D1, D2 :: list, Des::integer;
D1:=map(x -> 5^x,[seq(i,i=0..(nops(N)-1))]): D2:=[seq(N[j]*D1[j],j=1..nops(N))]:
Des:=add( i, i=D2 ); end proc:
Contoh: input I := [1,1,1,2,3,4], output O = 1.5^0 + 1.5^1 + 1.5^2 + 2.5^3+ 3.5^4 + 4.5^4.
A:=[1,1,1,2,3,4]: UbahPenKeDes(A);
14656
Program 3.2 Mengubah Desimal ke Vektor Penta
Deskripsi : UbahDesKe Pen adalah Prosedur untuk mengubah desimal ke vektor penta.
Input : integer. Output : vektor penta.
UbahDesKePen := proc(B::integer) local Kv::list: Kv:=convert(B,base,5): end proc: UbahDesKePen(259); [4,1,0,2]
Program 3.3 Reduksi Nol
Deskripsi : ReduNol adalah prosedur untuk mereduksi nilai nol. Input : vektor penta
ReduNol:=proc(R::list)
local T::list, j,t::integer: T:=R: t:=nops(T):
for j while T[t]=0 and t>1 do T:=subsop(t=NULL,T): t:=t-1: end do: return(T); end proc: Contoh: A:=[1,0,2,0,4,0] ReduNol(A); [1,0,2,0,4]
Program 3.4 Adisi Vektor
Deskripsi : AdisiP adalah prosedur untuk menjumlahkan dua vektor. Input : vektor penta.
Output : vektor penta.
AdisiP:=proc(S::list,T::list) local R::list, s,j,t::integer: s:=nops(S): t:=s:
if S=[0] then return(T); elif T=[0] then return(S); elif s=nops(T) then
R:=[seq((op(i,S)+op(i,T)) mod 5,i=1..s)]; R:=ReduNol(R);
elif nops(S)<nops(T) then
subsop(seq(i=(op(i,S)+op(i,T) mod 5),i=1..nops(S)),T); else subsop(seq(i=(op(i,T)+op(i,S) mod 5),i=1..nops(T)),S); end if: end proc: Contoh: A:=[3,4,3]: B:=[3,4,1]: AdisiP(B,A); [1,3,4]
Program 3.5 Negatif Vektor
Deskripsi : NegP adalah prosedur untuk mengubah vektor menjadi negatif. Input : vektor penta.
Output : vektor penta. NegP:=proc(L::list) map(x->(-x mod 5),L);
end proc: Contoh:
A:=[1,0,3]: nB:=NegP(A); [4,0,2]
Progaram 3.6 Kelipatan Vektor
Deskripsi : KVek adalah prosedur untuk kelipatan vektor. Input : vektor penta dan integer.
Output : vektor penta.
KVekP:=proc(L::list,n::integer[0..4]) if n=0 then return([0]);
elif n=1 then return(L); else ((n*L)mod 5) end if; end proc:
Contoh:
A:=[2,4,3,1]: KVekP(A,3); [1,2,4,3]
Program 3.7 Perkalian vektor
Deskripsi : KaliP adalah prosedur untuk perkalian vektor A dan B. Input : vektor penta.
Output : vektor penta.
KaliP:=proc(A::list,B::list)
local R,U,V,S,T::list, s,j,t,a::integer: if A=[0] or B=[0] then return([0]) end if; s:=nops(A): t:=nops(B): S:=A: T:=B: if t<s then S:=B: T:=A: a:=s: s:=t: t:=a: end if: R:=KVekP(T,op(1,S)); for j from 1 to (s-1) do T:=[0,op(T)]; V:=KVekP(T,op(j+1,S)): R:=AdisiP(R,V): end do: return(R); end proc: Contoh: S:=[2,1,1,3]: T:=[0,4,1,2]: KaliT(S,T);
[0,3,1,4,0,0,1] Program 3.8 Pembagian Vektor
Deskripsi : BagiP adalah prosedur untuk pembagian vektor A dan B. Input : vektor penta.
Output : vektor penta.
BagiP:=proc(T::list,S::list)
local K,Q,R,H::list, i,g,r,s,k,h,t::integer: if S=[0] then return(false) end if:
R:=T: Q:=[0]: r:=nops(T): s:=nops(S): g:=op(s,S): if s=1 then Q:=KVekP(R,op(S)): R:=[0]: return([Q,R]); end if: for i while r>=s do k:=r-s: t:=op(r,R): h:=(t/g)mod 5: if k=0 then K:=KVekP(S,h): Q:=AdisiP(Q,[h]): else H:=KVekP(S,h): K:=[seq(0,j=1..k),op(H)]: Q:=AdisiP(Q,[seq(0,j=1..k),h]): end if: K:=NegP(K): R:=AdisiP(K,R): r:=nops(R): end do: return([Q,R]); end proc: Contoh: A:=[2,3,4,1,3,2]: B:=[2,1,1]: BagiP(A,B); [[1,1,1,2],[0]]
Program 3.9 Hasil Bagi vektor A oleh B
Deskripsi : QBagiP adalah prosedur untuk mendapatkan hasil bagi vektor A oleh B.
Input : vektor penta. Output : vektor penta.
local L::list: L:=BagiP(A,B): return(op(1,L)); end proc: Contoh: D:=[2,0,1,4,1]: E:=[3,4,1]: QBagiP(D,E); [2,2,0,1,2]
Program 3.10 Sisa Bagi (A mod B)
Deskripsi : RBagiP adalah prosedur untuk mendapatkan sisa bagi A mod B. Input : vektor penta dan integer.
Output : vektor penta.
BagiP:=proc(A::list,B::list) local L::list: L:=BagiP(A,B): return(op(2,L)); end proc: Contoh: A:=[4,4,1,3,1]: B:=[3,0,1,2,1]: RBagiP(A,B); [1,0,3]
Program 3.11 Vektor A Pangkat ke x mod vector B
Deskripsi : PangkatPM adalah prosedur A pangkat ke x mod B. Input : vektor, integer.
Output : vektor.
PangkatPM:=proc(A::list,x::integer,B::list) local H,G,K,L,X::list, i::integer:
X:=convert(x,base,2); G:=A: H:=[1]:
if op(1,X)=1 then H:=G:
end if:
for i from 2 to nops(X) do K:=KaliP(G,G): G:=RBagiP(K,B): if op(i,X)=1 then L:=KaliP(H,G): H:=RBagiP(L,B): end if: end do: return(H);
end proc:
Contoh:
A:=[1,0,1,2,3]: B:=[1,4,0,2,3,1]: S:=PangkatPM(A,80,B);
S:=[1,4,0,2,3,1]
Program 3.12 FPB dari Vektor A dan Vektor B
Deskripsi : GcdP adalah prosedur untuk mencari FPB dari vektor A dan B. Input : vektor penta.
Output : vektor penta.
GcdP:=proc(A::list,B::list)
local RA,RB,S,T,L::list, i,a,b::integer: a:=nops(A): b:=nops(B):
RA:=A: RB:=B: if a<b then RA:=B: RB:=A: end if:
if RB=[0] then return(RA) end if; L:=RBagiP(RA,RB): RA:=RB: RB:=L: for i while RB<>[0] do L:=RBagiP(RA,RB): RA:=RB: RB:=L: end do: return(RA); end proc: Contoh: A:=[1,0,3,2,1]: B:=[2,4,1]: GcdP(A,B); [4]
Program 3.13 Acak Vektor Penta
Deskripsi : AcakPen adalah prosedur untuk membangkitkan vektor terner pada mod ? secara acak.
Input : integer positif. Output : vektor penta.
AcakPenX:=proc(m::posint)
local AcIn::procedure, p,q,i::integer: AcIn := rand(5^m):
p:=AcIn(): q:=p mod 5:
p:=AcIn(): q:=p mod 5: end do: UbahDesKePen(p); end proc: Contoh: AcakPen(8); [1,3,0,3,1,2,2,1]
Program 3.14 Menggeser Satu Langkah
Deskripsi : GSatuP adalah prosedur untuk menggeser vektor satu langkah ke kiri.
Input : vektor penta dan integer positif. Output : vektor penta.
GSatuP:=proc(T::list,m::posint) local R,H,L::list, t::integer: L:=DatP[m]: t:=nops(T): if t<m then R:=[0,op(T)]; else R:=[0,op(subsop(m=NULL,T))]: R:=ReduNol(R); H:=KVekP(L,op(t,T)): AdisiP(R,H); end if: end proc: Contoh: m:=12: S:=[1,2,1,3,0,4]: GSatuP(S,m); [0,1,2,3,4,0,4] Program 3.15 Geser Vektor
Deskripsi : GVekP adalah prosedur untuk menggeser vektor Input : vektor penta dan integer positif.
Output : vektor penta.
GVekP:=proc(T::list,s::nonnegint,m::posint) local R,H,K,L::list, d,t,j,x,y,k::integer: L:=DatP[m]:
t:=nops(T): d:=m-t: if s=0 then return(T): elif s=1 then GSatuP(T,m); elif s<=d then
elif s<m then: R:=[seq(0,i=1..s),seq(op(i,T),i=1..(m-s))]: R:=ReduNol(R); H:=L: k:=(m-s+1): K:=KVekP(H,op(k,T)): R:=AdisiP(R,K): for j while k<t do k:=k+1: H:=GSatuP(H,m): K:=KVekP(H,op(k,T)): R:=AdisiP(R,K): end do: return(R);
else return("Input kedua kegedean") end if; end proc: Contoh: S:=[3,1,0,2,4,1]: m:=12: GVekP(S,3,m); [0,0,0,3,1,0,2,4,1]
Program 3.16 Perkalian Vektor dalam mod ?
Deskripsi : MultiP adalah prosedur untuk perkalian vektor A dan B mod ? . Input : vektor penta dan integer postif.
Output : vektor penta.
MultiP:=proc(A::list,B::list,m::posint) local R,U,V,S,T::list, s,j,t,a::integer: if A=[0] or B=[0] then return([0]) end if; s:=nops(A): t:=nops(B): S:=A: T:=B: if t<s then S:=B: T:=A: a:=s: s:=t: t:=a: end if: R:=KVekP(T,op(1,S)); for j from 1 to (s-1) do T:=GSatuP(T,m): V:=KVekP(T,op(j+1,S)): R:=AdisiP(R,V): end do: return(R); end proc: Contoh: S:=[1,2,1,4,2]: T:=[2,1,0,2,4]: m:=9: MultiP(S,T,m); [2,0,4,1,1,2,2,0,3]
Pogram 3.17 Invers
Deskripsi : InvP adalah prosedur untuk A-1 mod ? . Input : vektor penta dan integer.
Output : vektor penta.
InvP:=proc(T::list,m::integer)
local QA,QB,RA,RB,R,S,L,Tmp,H::list, i::integer: S:=NegP(DatP[m]):
if T=[0] then return(false) end if: if nops(T)=1 then return(T) end if: RA:=[op(S),seq(0,j=1..(m-nops(S))),1]: RB:=T: QA:=[0]: QB:=[1]: L:=BagiP(RA,RB): RA:=RB: RB:=op(2,L): for i while RB<>[0] do Tmp:=QA: QA:=QB: H:=MultiP(QB,op(1,L),m): R:=NegP(H): QB:=AdisiP(Tmp,R): L:=BagiP(RA,RB): RA:=RB: RB:=op(2,L): end do:
if (RA=[4] xor RA=[1])then H:=KVekP(QB,op(RA)) else H:=KVekP(NegP(QB),op(RA)) end if: return(H); end proc: Contoh: A:=[1,1,1,3,1,3,4,2,3]: m:=15: InvP(A,m); [2,0,1,1,1,2,4,0,3,1,3,4,0,1] Program 3.18 Pembagian Vektor Penta mod ?
Deskripsi : DivP adalah prosedur untuk membagi A oleh B mod ? G Input : vektor penta dan integer.
Output : vektor penta.
DivP:=proc(A::list,B::list,m::integer) local iB::list:
iB:=InvP(B,m); MultiP(A,iB,m);
end proc: Contoh:
A:=[0,1,1,3,2]: B:=[1,0,1,4,3]: m:=10: DivP(A,B,m);
[2,4,3,1,4,3,3,3,3,1] Program 3.19 Negatif Integer mod ?
Deskripsi : ModI adalah prosedur yang menghitung ? mod ? dalam rentang negatif.
Input : integer. Output : integer.
ModN:= proc(a::integer, n::posint) local b, c::integer: b := a mod n: c := floor(n/2): if b > c then b := -(n-b) end if: return(b): end proc: Contoh: ModN(18,26); -8
Progran 3.20 Eksponen mod ?
Deskripsi : ExpP adalah prosedur untuk Ax mod ? . Input : vektor penta dan integer.
Output : vektor penta.
ExpP:=proc(A::list,x::integer,m::integer) local H,G,X::list, i,p,k,n::integer: p:=5^m-1: k:=ModN(x,p): if k>=0 then X:=convert(k,base,2); G:=A: H:=[1]: if op(1,X)=1 then H:=G: end if:
for i from 2 to nops(X) do G:=MultiP(G,G,m): if op(i,X)=1 then H:=MultiP(H,G,m): end if: end do: else n:=-k:
X:=convert(n,base,2); G:=InvP(A,m): H:=[1]: if op(1,X)=1 then H:=G:
end if:
for i from 2 to nops(X) do G:=MultiP(G,G,m): if op(i,X)=1 then H:=MultiP(H,G,m): end if: end do: end if: return(H); end proc: Contoh: S:=[1,0,1,3]: m:=14: ExpT(S,20,m); [2,3,3,0,4,2,0,3,2,4,3,1,4] Program 3.21 Vektor A Pangkat ?
Deskripsi : PangkatP adalah prosedur A pangkat ke ? . Input : vektor penta.
Output : vektor penta.
PangkatP:=proc(A::list,x::integer) local H,G,X::list, i::integer: X:=convert(x,base,2);
G:=A: H:=[0]:
if op(1,X)=1 then H:=G:
end if:
for i from 2 to nops(X) do G:=KaliP(G,G): if op(i,X)=1 then H:=KaliP(H,G): end if: end do: return(H); end proc: Contoh: A:=[3,1,2,4]: x:=3: S:=PangkatT(A,x); S:=[2,2,3,0,4,0,1,1,4] Program 3.22 Test Irreducible
Input : vektor penta. Output : true or false. TestIrrP:=proc(A::list)
local U,H,S,W::list, i,m,a,h::integer: a:=nops(A)-1: m:=floor(a/2): W:=[0,1]: for i from 1 to m do W:=PangkatPM(W,5,A); U:=AdisiP(W,[0,4]): H:=GcdP(U,A): h:=nops(H): if h>1 then return(false); break; end if: end do: return(true); end proc: Contoh: S:=AcakPen(12); S:=[1,0,1,2,1,0,0,4,4,4,0,1] rA:=TestIrrP(S); rA:= true
Program 3.23 Membangkitkan Vektor Irreducible secara Acak Deskripsi : GenIrrP adalah prosedur untuk membangkitkan vektor
irreducible secara acak. Input : integer.
Output : vektor penta.
GenIrrP:=proc(m::posint)
local X,Y,T::list, x,i::integer: X:=AcakPenX(m-1); x:=nops(X); Y:=[op(X),seq(0,j=1..(m-x)),1]: T:=TestIrrP(Y);
for i while T=false do
X:=AcakPenX(m-1); x:=nops(X); Y:=[op(X),seq(0,j=1..(m-x)),1]: T:=TestIrrP(Y); end do: return(Y); end proc: Contoh: GenIrrP(15); [4,3,0,2,1,0,4,3,3,1,4,0,1,1,0,1]
Program 3.24 Test Primitif
Deskripsi : TestPrimP adalah prosedur untuk test primitif Output : true or false.
TestPrimP:=proc(A::list)
local H::list, F::anything, i,m,a,h,k::integer: m:=nops(A)-1: h:=5^m-1: F:=ifactor(h); a:=nops(F); for i from 1 to a do k:=h/op(op(1,op(i,F))): H:=PangkatPM([0,1],k,A): if H=[1] then return(false); break; end if: end do: return(true); end proc: Contoh: S:=GenIrrP(3); S:=[2,3,0,1] pA:=TestPrimP(S); true
Program 3.25 Prima Relati Acak
Deskripsi : PrimaRelAcak adalah Prosedur untuk membangkitkan bilangan prima relatif modulo ?? ? ? secara acak.
Input : integer positif. Output : integer positif.
PrimaRelAcakP:=proc(m::posint)
local AcIn::PrimaRelAcakP, g,i,R,p::integer: p:=5^m-1: AcIn := rand(p): R:=AcIn(): g:=gcd(R,p): for i while g<>1 do R:=AcIn(): g:=gcd(R,p): end do: return(R): end proc: Contoh: m:=7: PrimaRelAcakP(m); 58423
Progran 3.26 Membangkitkan Semua Vektor Irreducible Berderajat ?
Deskripsi : GenIrrDmP adalah Prosedur untuk membangkitkan semua vektor irreducible bederajat ? G
Input : integer positif. Output : integer positif.
GenIrrDmP:=proc(m::posint)
local X,Y::list, H::set, T::symbol, i,x::integer: H:={}: for i from 1 to 5^(m-1) do if (i mod 5)<>0 then X:=UbahDesKePen(i); x:=nops(X); Y:=[op(X),seq(0,j=1..(m-x)),1]: T:=TestIrrP(Y); if T=true then H:={op(H),Y}: end if: end if: end do: return(H); end proc: Contoh: GenIrrDmT(3); {[1,1,0,1],[4,2,0,1],[3,4,0,1],[2,4,0,1],[2,3,0,1], [4,1,0,1],[3,3,0,1],[1,2,0,1]}}
Lampiran 3 Program Birthday Paradox > BirthdayParadox:=proc(n::integer,k::integer) local p::integer: p:=1-product((n-(i-1))/n, i=1..k ); evalf(p): end proc: > Contoh : > BirthdayParadox(365,23); 0.5072972343
Lampiran 4 Algoritme penunjang algoritme Index-Caculus untuk menentukan
solusi masalah logaritma diskret pada ? ? ??? ??
Algoritme 4.1 Mengubah Vektor ke Polinomial (UbahVekPoli)
Input : Vektor N = [??? ?? ?g ????
Output : Polinomial (D)
Langkah- langkah:
1. D1 = Petakan ? ke ?? pangkat ? pada [barisan ?, ? ? ? sampai (banyaknya elemen vektor N dikurangi 1)]
2. D2 = [barisan (N[?? ? ? ??], ? ? ? ??•???(banyaknya elemen N)] 3. D = add(?, ? ? D2)
4. Return (D)
Algotitme 4.2 Memisahkan Polinomial dengan Pangkatnya (EkstrakP)
Input : Integer ? dan vektor B = [??????g ????
Output : Vektor [[H], [Q], acak]
Langkah- langkah: 1. R = [] 2. ? ? ?? ? ?
3. Roll = rand(dari 1 sampai ? ? ? ) 4. Acak = roll()
5. E = Gunakan algoritme MultiP modulo ? dengan input vektor B, dan (ExpP([0,1]) modulo ? , integer acak)
6. N = Gunakan algoritme UbahPenKeDes dengan input vektor E (Algoritme 4.1)
7. F = Faktorkan N dalam modulo 5 8. ? ? type? ? ????
9. Jika ? = true maka R= [operan F] 10. U = [elemen R]
11. X = array (1 sampai banyaknya elemen U) 12. Y = array (1 sampai banyaknya elemen U)
11.1 Jika ? dari 1 sampai banyaknya elemen U, lakukan: 11.1.1 H = elemen ke-? dari U
11.1.2 ? ? type (H, ‘^’) 11.2 Jika ? ? true maka
11.2.1 C = Konpersi H ke list 11.2.3 J = Elemen ke-1 dari C 11.2.4 Q = Elemen ke-2 dari C 11.2.5 X[?] = J
11.2.6 Y[?] = Q 11.3 Selainnya 11.3.1 J = H, Q = 1 11.3.2 X[i] = J, Y[i] = 1 13. L = Konpersi X ke list 14. M = Konpersi Y ke list 15. Return( L, M, acak)
16. Selainnya jika banyaknya elemen F sama dengan 2 dan type(F, ‘^’) = true, maka
16.1 R = elemen ke-1 dari F 16.2 Q = elemen ke-2 dari F 1.6.3 Return (R, Q, acak)
Algoritme 4.3 Eksrak Matriks (EkstrakMP)
Input : Vektor M = [? ??? ??g ?? ?? dan array S
Output : Vektor ([Z1, ??]) Langkah- langkah:
1. ? ? elemen ke-3 dari M
2. M1 = {elemen(elemen ke-1 dari M)} 3. M2 = elemen ke-2 dari M
4. A = Konpersi S ke list 5. L = {elemen (A)} 6. J = M1 subset L 7. Jika J = true, maka
7.1 Z = array (1 sampai banyaknya elemen L)
7.2 Untuk ? dari 1 sampai banyaknya elemen L, lakukan: 7.2.1 Z[?] = 0
7.3 Untuk ? dari 1 sampai banyaknya elemen M1, lakukan: 7.3.1 ? ? Elemen ke-? dari M1
7.3.2 Untuk ? dari 1 selama ? ? ? , lakukan:
7.3.2.1 ? ? Elemen ke-? dari A
7.3.2.2 Z[? ? ? ] = Elemen ke-? dari M2 7.4 Z1 = Konpersi Z ke list
7.5 Selainnya Z1 = [], ? ? [] 8. Return (Z1, ?)
Lampiran 5 Faktorisasi Prima
Tabel 28 Faktorisasi Prima Order ? ? ??? ??
? Order(? ) Faktor Prima
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 124 624 3124 15624 78124 390624 1953124 9765624 48828124 244140624 1220703124 6103515624 50517578124 15257890624 762939453124 3814697265624 19073486328124 953674316406624 474837158203124 2384185791015624 11920928955078124 59604644775390624 298023223876953124 1490116119384765624 7450580596923828124 37252902984619140624 186264514923095703124 931322574615478515624 4656612873077392578124 23283064365386962890624 (2)3(31) (2)4(3)(13) (2)2(11)(71) (2)3(3)2(7)(31) (2)2(19531) (2)5(3)(13)(313) (2)2(19)(31)(829) (2)3(3)(11)(71)(521) (2)3(12207031) (2)4(3)2(7)(13)(31)(601) (2)2(305175781) (2)3(3)(29)(449)(19531) (2)2(11) (31)(71)(181)(1741) (2)6(3)(13)(17)(313)(11489) (2)2(409)(466344409) (2)3(3)3(7)(19)(31)(829)(5167) (2)2(191)(3981071)(6271) (2)4(3)(11)(13)(41)(71)(521)(9161) (2)2(31)(379)(519499)(19531) (2)3(3)(23)(67)(12207031)(5281) (2)2(332207361361)(8971) (2)5(3)2(7)(13)(31)(313)(601)(390001) (2)2(11) (71)(101)(251)(401)(9384251) (2)3(3)(305175781)(38923)(5227) (2)2(19)(31)(109)(271)(829)(31051)(4159) (2)4(3)(13)(29449)(234750601)(19531) (2)2(59)(22125996444329)(35671) (3)3(2)2(7)(11)(31)(61)(71)(181)(521)(7621)(1741) (2)2(6255525084773588471)(1861) (2)7(3)(13)(17)(313)(29423041)(11489)(2593)
Lampiran 6 Program Solusi Masalah Logaritma Diskret pada ? ? ??? ?? Implementasi program menggunakan software Maple 11.
Program 7.1 Exhaustive search (Pelacakan Lengkap)
Deskripsi : Pelaclog adalah prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ?? dengan algoritme Pelecakan lengkap. Input : vektor penta B dan integer ? .
Output : integer ? .
Pelaclog:=proc(B::list,m::posint) local A::list, i,x::integer: A:=[0,1]: x:=1:
for i from 1 while A<>B do A:=MultiP(A,[0,1],m): x:=x+1: end do: return(x): end proc: Contoh : m:= 12: B:= [2,1,1,2,3,0,2,2,3,1,4,4]: Pelaclog(B,m); 1578
Program 7.2 Pelacakan Lengkap Umum
Deskripsi : PelaclogUmum adalah prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ?? dengan sebarang basis. Input : vektor penta B, T dan integer ? .
Output : integer x.
PelaclogUmum:=proc(T::list,B::list,m::posint) local A::list, i,x::integer:
A:=T: x:=1:
for i from 1 while A<>B do A:=MultiP(A,T,m): x:=x+1: end do: return(x): end proc: Contoh: m:=7: A:=[0,1]; B:=[4,3,1,1,2,1]; PelaclogUmum(A,B,m); 58400
Program 7.3 Pelacakan Lengkap Negatif
Deskripsi : PelacNeg adalah prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ?? dengan algoritme pelacakan lengkap
Negatif .
Input : vektor pentaner B dan integer ? . Output : integer ? .
PelacNeg:=proc(B::list,m::integer) local p,n,x,i,y::integer, H,A::list: p:=5^m-1:
n:=p/2: H:=NegP(B): A:=[0,1]: x:=1:
for i from 1 while A<>H do A:=MultiP(A,[0,1],m): x:=x+1: y:=x+n mod p: if A=B then return(x); break; end if; end do: return(y): end proc: Contoh m:=8; B:=[1,3,4,4,4,0,0,1]; PelacNeg(B,m); 4587
Program 7.4 Baby-Step Giant-Step 1 Tahap Baby-step :
Deskripsi : Tahap Baby-step untuk menyimpan nilai ? pada ? ? ??? ?? Input : integer ? , ? ? ? , ? ? ?? ??G
Output : array DatPG. DatPG:=array(1..5^m-1): X:=ExpP([0,1],a-1,m):
for i from 1 to (b-a+1) do X:=MultiP([0,1],X,m): h:=UbahPenKeDes(X): DatPG [h]:=(a-1)+i: end do:
Tahap Giant-step 1:
Deskripsi : BabyGiant1P yaitu prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ?? dengan algoritme Baby-step Giant-step1. Input : vektor penta P dan integer ? , ? , array pada tahap Baby-step. Output : integer x.
BabyGiant1P:=
proc(T::list,m::posint,n::integer,S::array)
local p,i,j,h,s,k::integer, K,H::list, t::anything: p:=5^m-1: K:=ExpP([0,1],-n,m); H:=T: s:=UbahPenKeDes(H); t:=S[s]; k:=t: j:=1:
for i from 1 while type(t,'indexed') do H:=MultiP(H,K,m): s:=UbahPenKeDes(H); t:=S[s]; j:=j+1: k:=((n*(j-1))+t) mod p : end do: return(k); end proc: Contoh m:=9: b:=1398: P:=[2,1,1,4,2,3,3,4,4]; x:=BabyGiant1P(P,m,b,DatPG9); 5643
Program 7.5 Baby-Step Giant Step 2 Tahap Baby-step :
Deskripsi : Tahap Baby-step untuk menyimpan nilai ? pada ? ? ??? ?? Input : integer ? ?? ?? G
Output : array DatPM. DatPM:=array(1..5^m-1): X:=ExpP([0,1],a-1,m):
for i from 1 to (b-a+1) do X:=MultiP([0,1],X,m): h:=UbahPenKeDes(X): DatPM [h]:=(a-1)+i: end do:
Tahap Giant-step 2:
Deskripsi : BabyGiant2P yaitu prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ?? dengan algoritme Baby-step Giant-step 2. Input : vektor penta P dan integer ? G
Output : integer x. BabyGiant2P:=
proc(T::list,m::posint,n::integer,S::array)
local p,i,j,h,s,k::integer, K,H::list, t::anything: p:=5^m-1: K:=ExpP([0,1],-n,m); H:=T: s:=UbahPenKeDes(H); t:=S[s]; k:=t: j:=1:
for i from 1 while type(t,'indexed') do H:=MultiP(H,K,m): s:=UbahPenKeDes(H); t:=S[s]; j:=j+1: k:=((n*(j-1))+t) mod p : end do: return(k); end proc: Contoh m:=11: P:=[1,2,3,1,3,3,2,3,3,1]; x:=BabyGiant2P(P,m,DatPM11); 43284
Program 7.6 Baby-Step Gian- Step 3 Tahap Baby-step :
Menggunakan simpanan pada Baby-step Giant-step 2. Tahap Giant- step 3 :
BabyGiant3P:=
proc(T::list,m::posint,n::integer,S::array)
local p,i,j,h,s,k::integer, K,H::list, t::anything: p:=5^m-1: K:=ExpP([0,1],-n*m,m); H:=T: s:=UbahPenKeDes(H); t:=S[s]; k:=t: j:=1:
for i from 1 while type(t,'indexed') do H:=MultiP(H,K,m): s:=UbahPenKeDes(H); t:=S[s]; j:=j+1: k:=(n*m*(j-1)+t) mod p: end do: return(k); end proc: Contoh m:=12; P:=[3,4,4,3,0,0,3,4,1,3,4,1]; GiantStep3P(P,m,5,DatPM12); X=53284
Program 7.7 Baby-Step Giant-Step 4 Tahap Baby-step :
Deskripsi : tahap Baby-step untuk menyimpan nilai ? pada ? ? ??? ?? Input : integer ? ? ? ?? .
Output : array DatTF. DatPR:=array(1..5^m-1): X:=ExpP([0,1],a-1,m):
for i from 1 to (b-a+1) do X:=MultiP([0,1],X,m): h:=UbahPenKeDes(X): DatPR[h]:=(a-1)+i: end do: save DatPR,"d:\\programMaple\\DatPR.m"; Tahap Giant-step 4 :
Deskripsi :BabyGiant4P yaitu prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ?? dengan algiritme Baby-step Giant-step4. Input : vektor pentaner P dan integer ? ?? , array pada tahap Baby-step. Output : integer x.
BabyGian4P:=
proc(T::list,m::posint,n::integer,S::array)
local p,i,j,h,s,k::integer, K,H::list, t::anything: p:=5^m-1: K:=ExpP([0,1],-n,m); H:=T: s:=UbahPenKeDes(H); t:=S[s]; k:=t: j:=1:
H:=MultiP(H,K,m): s:=UbahPenKeDes(H); t:=S[s]; j:=j+1: k:=((n*(j-1))+t) mod p : end do: return(k); end proc: Contoh m:=18: b:=1280000: P:=[1,3,2,4,3,3,1,1,2,4,2,1,3,4,4,4,0,2]; x:=BabyGiant4P(P,m,b,DatPR18); 2013438726562
Program 7.8 Fungsi Partisi Penunjang Algoritme Pollard Rho
Deskripsi : FPolardP adalah prosedur untuk mempartisi fungsi iterasi. Input : vektor penta A, B dan integer ? G
Output : vektor penta.
FPolardP:=proc(L::list,A::list,B::list,m::posint) local a,b,q,h,u::integer, H::list:
q:=(5^m-1):
H:=op(nops(H),L): a:=op(2,L): b:=op(3,L): h:=op(1,H) mod 5: if h=0 then H:=MultiP(H,A,m): a:=(a+1) mod q: elif h=1 then H:=MultiP(H,B,m): b:=(b+1) mod q: else H:=MultiP(H,H,m): a:=(2*a) mod q: b:=(2*b) mod q: end if: return([H,a,b]); end proc: Contoh: M:=14: P:=5^m-1: H:=[[1],0,0]: a:=[0,3,1]: b:=[4,4,1]: FPolard(H,a,b,m); [[4,4,1],0,1]
Program 7.9 Prima Relatif Acak Penunjang Algoritme Pollad Rho
Deskripsi : PrimaReAcak adalah membangkitkan bilangan prima relatif modulo 5^m-1 secara acak
Input : vektor penta A, B dan integer ? G Output : vektor penta.
PrimaRelAcakP:=proc(m::posint)
local AcIn::PrimaRelAcakP, g,i,R,p::integer: p:=5^m-1: AcIn := rand(p): R:=AcIn(): g:=gcd(R,p): for i while g<>1 do R:=AcIn(): g:=gcd(R,p): end do: return(R): end proc: Contoh: m:=11; A:=PrimaRelAcakP(m); A=20544909
Program 7.10 Pollard Rho
Deskripsi : AlgPolardP adalah prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ??
Input : vektor penta P dan integer ? ?? . Output : integer ? .
AlgPolardP:=proc(T::list,n::integer,m::posint)
local i,aM,bM,aL,bL,q,r,s,u::integer, Hm,Hl,G::list, L,M::list: q:=5^m-1: G:=ExpP([0,1],n,m): M:=[[1],0,0]: M:=FPolardP(M,G,T,m): L:=M: Hm:=op(1,M): L:=FPolardP(L,G,T,m): Hl:=op(1,L): for i while Hm<>Hl do M:=FPolardP(M,G,T,m): Hm:=op(1,M): L:=FPolardP(L,G,T,m): L:=FPolardP(L,G,T,m): Hl:=op(1,L): end do: aM:=op(2,M): bM:=op(3,M): aL:=op(2,L): bL:=op(3,L): r:=(bM-bL) mod q: if r=0 then return(FAIL); else
s:=(aL-aM) mod q: u:=n*(s/r) mod q; return(u); end if: end proc: Contoh m:=14: Y:=[1,1,1,2,2,0,2,1,3,0,0,3,0,1] n:= PrimaRelAcakP(m); n:=1214072539 c:=AlgPolardP(Y,n,m); c:=4584697796 Program 7.11 Pohlig-Hellman
Deskripsi : LogPolhigHelman adalah prosedur untuk menentukan solusi logaritma diskret pada ? ? ??? ??
Input : vektor penta B dan integer ? ?? G Output : integer x. LogPolhigHelman:=proc(B::list,m::posint) local i,n,r,q,t,l,u,j,k,R,c,f,v,p1,ff,f1,p0::integer,P,s::any thing, g,G,xA,xB,X,Y,T,iG,bG,a,b,d,z,cek::list, y::symbol: y:=type(m,even); f:=5^m-1; ff:=ifactor(f): p0:=op(1,ff); p1:=op(2,p0); if p1=2 then f1:=2: elif p1=3 then f1:=24: elif p1=4 then f1:=4: elif p1=5 then f1:=8: elif p1=6 then f1:=16: elif p1=7 then f1:=32: else f1:=64: end if: n:=(f)/f1: P:=ifactor(n): r:=nops(P):
X:=[seq(0*i,i=1..r)]: Y:=[seq(0*i,i=1..r)]: for i from 1 to r do s:=op(i,P); q:=op(op(1,s)); if nops(s)=1 then t:=1: else t:=op(2,s); end if: g:=[1]: l:=0: u:=n/q: xA:= ExpP([0,1],u,m); for j from 0 to (t-1) do if j=0 then k:=0: else k:=R*(q^(j-1)): end if: T:=ExpP([0,1],k,m); G:=MultiP(g,T,m): iG:=InvP(G,m): bG:=MultiP(iG,B,m): xB:=ExpP(bG,(n/(q^(j+1))),m); R:=NaiflogUmum(xA,xB,m); l:=l+(R*(q)^j); end do: X[i]:=l; b:=(q^j); Y[i]:=b: end do: a:=X; d:=Y; c:=chrem(a,d); if y=true then cek:=ExpP([0,1],c,m); if cek<>B then c:=c+(n/2); end if: else for v from 1 to f1 do z:=ExpP([0,1],c,m); if z=B then c:=c: else c:=c+n: end if: end do: end if: return(c);
end proc: Contoh : m:=15: B:=[0,2,3,0,3,0,0,2,4,1,4,3,0,0,4]; LogPolhigHelman(B,m); 65321971
Program 7.12 Menyimpan Polinomial Basis Penunjang Algoritme Index- Calculus Basis2:=array(1..7): S:=GenIrrDmP(2); M:=op(2,S); L:=UbahVekKePoli(M); Basis2[7]:=L;
save Basis2, "d:\\programMaple\\Basis2.m"; print(Basi6);
Program 7.13 UbahVekKePoli Penunjang Algoritme Index-Calculus Deskripsi : UbahVekKePoli adalah prosedur untuk mengubah vektor ke polinomial.
Input : vektor penta N. Output : polinomial. UbahVekKePoli:=proc(N::list) local D1,D2,D::list: D1:=map(x -> x1^x,[seq(i,i=0..(nops(N)-1))]); D2:=[seq(N[j]*D1[j],j=1..nops(N))]; D:=add( i, i=D2 ); return(D): end proc: Contoh: N:=[3,0,0,4,1,0,0,0,2,2,2,2,4,0,2,4,4,2,0,3]; UbahVekKePoli(N); 3+4x13+x14+2x18+2x19+2x110+2x111+4x112+2x114+4x115+ 4x116+2x117+3xl19
Program 7.14 EkstrakP Penunjang Algoritme Index-Calculus
Deskripsi : EkstrakP adalah prosedur untuk memisahkan polinomial dan pangkatnya dari faktor yang dibangkitkan secara acak dari ??. Input : integer ? dan vektor P.
Output : polinomial, pangkat, integer. EkstrakP:=proc(m::integer,B::list)
local R,E,N,F,U,X,Y,H,V,C,J,Q,L,M::list, n,roll,acak,i::integer, w,v::symbol: R:=[]:
n:=5^m-1; roll := rand(1..n-1): acak:=roll(); E:=MultiP(B,(ExpP([0,1],acak,m)),m); N:=UbahVekKePoli(E); F:=Factor(N) mod 5; w:=type( F, `*` );
if w=true then R:=[op(F)]; U:=[op(R)];
X:=array(1..nops(U)): Y:=array(1..nops(U)):
for i from 1 to nops(U) do H:=op(i,U); v:=type( H, `^` ); if v=true then C:=convert(H, `list`); J:=op(1,C); Q:=op(2,C); X[i]:=J; Y[i]:=Q; else J:=H; Q:=1; X[i]:=J; Y[i]:=Q; end if: end do: L:=convert(X, `list`); M:=convert(Y, `list`); return(L,M,acak); else
if nops(F)=2 and type( F, `^` )= true then R:=[op(1,F)]; Q:=[op(2,F)]; return(R,Q,acak); else R:=[F]; Q:=[1]; return(R,Q,acak); end if: end if: end proc: Contoh: m:=18; M:=[EkstrakP(m,[1])]; M:=[[3,x112+3x111+3x19+x18+4x17+3x15+3x13+2x12+3x1+3,1+x1, x12+2x1+4],[1,1,2,2],464554880040]
Program 7.15 EkstrakMP Penunjang Algoritme Index-Calculus
Deskripsi : EkstrakMP adalah prosedur untuk menyesuaikan letak pangkat yang bersesuaian dengan faktor basis.
Input : vektor penta M, faktor basis S. Output : polinomial, pangkat, integer. EkstrakMP:=proc(M::list,S::array)
local M2,A,list,Z1::list, i,m,f,r::integer, M1,L::set, J,Z::symbol, a,b::anything: r:=[op(3,M)]; M1:={op(op(1,M))}; M2:=(op(2,M)); A:=convert(S, `list`): L:={op(A)}; J:= M1 subset L; if J=true then Z:=array(1..nops(L)):
for i from 1 to nops(L) do Z[i]:=0;
end do:
for m from 1 to nops(M1) do b:=op(m,M1);
for f from 1 while a <> b do a:=op(f,A); end do: Z[f-1]:=op(m,M2); end do: Z1:=convert(Z, `list`): else Z1:=[]; r:=[]; end if: return(Z1,r); end proc: Contoh: m:=9: L:=[x1,x1+2,3+x1,2+x12,3+x12]: B:=[0,1,2,3,0,2,0,2]; MC:=[EkstrakP(m,B)]; MC:=[[4,x16+3x14+x12+2,2+x12],[1,1,1],1717663] A:=EkstrakMP(MC,L); A:=[],[] Ket : L:=[x1,x1+2,3+x1,2+x12,3+x12: Dismpan dalam bentuk array.
Program 7.16 Algoritme Index-Calculus
Deskripsi : IndCalP adalah prosedur untuk menentukan solusi masalah logaritma diskret pada ? ? ??? ??.
Input : vektor penta M, integer ? , faktor basis ? . Output : polinomial, pangkat, integer.
with(LinearAlgebra): IndCalP:=proc(B::list,m::integer,L::array) local n,Hasil,RS,rS,i,j::integer, Cek,SS,a,CC,MM,BB,PP,C,N,V,A,M,T,H,Q::list, P,t,S,SH::anything, SB::symbol: n:=5^m-1; Q:=[op(convert(L, `list`))];
for j from 1 while RS<>nops(Q) do H:=[];
T:=[];
for i from 1 while nops(H)<>nops(Q) do M:=[EkstrakP(m,[1])];
A:=[EkstrakMP(M,L)];
if A <> [[], []] and SB=false then H:=[op(H),op(1,A)]:
T:=[op(T),op(op(2,A))]: SH:= Matrix(H):
rS:=Rank(SH); end if:
SB:={op(1,A)} subset {op(H)}; end do: V:=H; N:= map(x->(x mod n),T); S := Matrix(V): RS:=Rank(S); end do: t := Vector(N): P:=LinearSolve(S, t, method='modular'); C:=convert(P, `list`); PP:=map(x->(x mod n),C); BB:=B;
for j from 1 while Cek<>BB do MM:=[EkstrakP(m,B)];
CC:=[EkstrakMP(MM,L)]; if CC <> [[], []] then a:=op(1,CC);
SS:=[seq((op(i,a)*op(i,PP)) mod n,i=1..nops(a))]; Hasil:=(add( i, i=SS )-op(op(2,CC))) mod n;
Cek:=ExpP([0,1],Hasil,m); end if:
end do:
return(Hasil); end proc:
Contoh: m:=9: L:=[x1,x1+2,3+x1,2+x12,3+x12 B:=[0,2,4,1,4,3,2,3]; IndCalP(B,m,L); 821565