rendered paste body#!/usr/bin/perl -w
#
# EEA - Extended Euclidian Algorithm
#
use strict;
use bigint;
if($#ARGV < 1 or
not $ARGV[0] =~ /^\d+$/ or
not $ARGV[1] =~ /^\d+$/){
warn "Usage: $0 [int x] [int n]\n";
exit 1;
}
my ($r, $l) = @ARGV;
my ($n, $x) = ($l, $r);
my @p = (0, 1);
my @q = ();
my $counter = 0;
while($r != 0){
my $M = int($l/$r);
my $R = $l - $M*$r;
print "[ $counter ]\n";
print "$l = $M($r) + $R\n";
if($counter >= 2){
$p[$counter] = ($p[$counter-2] - $p[$counter-1]*$q[$counter-2]) % $n;
print "$p[$counter] = ($p[$counter-2] - $p[$counter-1]*$q[$counter-2]) % $n\n";
}
$q[$counter] = $M;
($l, $r) = ($r, $R);
$counter++;
print "\n";
}
print "[ $counter ]\n";
$p[$counter] = ($p[$counter-2] - $p[$counter-1]*$q[$counter-2]) % $n;
print "$p[$counter] = ($p[$counter-2] - $p[$counter-1]*$q[$counter-2]) % $n\n\n";
print "\@p = @p\n";
print "\@q = @q\n";
print "\nAnswer: $x^-1 mod $n = $p[$#p]\n";
exit 0;