All pastes #766402 Raw Edit

eea

public text v1 · immutable
·published 2007-11-08 21:14 UTC
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;