uebung11.plsrc
#!/usr/local/bin/perl -w
use strict; no strict 'refs'; use Math::BigInt;
sub extended_euclid {
$_[1] or return $_[0], 1, 0;
my ($d, $x, $y) = extended_euclid ($_[1], $_[0] % $_[1]);
$d, $y, $x - $y * ($_[0] / $_[1])
}
sub loese_mod_eq {
my ($d, $x, $y) = extended_euclid ($_[0], $_[2]);
$_[1] % $d ? undef : map { ($x * $_[1] / $d % $_[2] + $_ * $_[2] / $d)
% $_[2] } 0..$d-1
}
sub prob38 {
print "3^$_%43=", (new Math::BigInt(3)**$_)%43, "\n" for 0..41
}
sub elGamal {
my ($y1, $y2, $a, $p) = @_;
$y2*[loese_mod_eq(new Math::BigInt($y1)**$a, 1, $p)]->[0] % $p
}
sub prob39 {
print elGamal (24, 7, 11, 43), "\n"
}
my ($p, $g, $n, $a) = map { new Math::BigInt ($_) } 458009, 2, 57251, 56851;
sub f {
my ($b, $y, $z) = @_;
$b % 3 == 1 and return $a*$b%$p, $y, ($z+1)%$n;
$b % 3 == 0 and return $b*$b%$p, 2*$y%$n, 2*$z%$n;
$b % 3 == 2 and return $g*$b%$p, ($y+1)%$p, $z
}
sub prob41 {
my ($b,$y,$z) = f map { new Math::BigInt ($_) } 1,0,0;
my ($bs,$ys,$zs) = f $b,$y,$z; my $i;
while ($b != $bs) {
$i++;
($b,$y,$z) = f $b,$y,$z;
($bs,$ys,$zs) = f $bs,$ys,$zs;
($bs,$ys,$zs) = f $bs,$ys,$zs
}
print "$i Iterationen, Kollision bei \$(b_i=$b, y_i=$y, z_i=$z),",
"(b_{2i}=$bs, y_{2i}=$ys, z_{2i}=$zs)\$.\\\\\n";
if ([extended_euclid ($zs-$z, $n)]->[0] == 1) {
print '$ggT(z_{2i}-z_i, n) = 1$, somit ',
'$x = (y_i-y_{2i}) \cdot (z_{2i}-z_i)^{-1} \mod n = ', ($y-$ys),
' \cdot ', [loese_mod_eq($zs-$z,1,$n)]->[0], ' \mod n = ',
(($y-$ys)*[loese_mod_eq($zs-$z,1,$n)]->[0])%$n, "\$\n";
} else {
print 'FAILURE, da $ggT(z_{2i}-z_i, n)$ \not= 1', "\n";
}
}
&{'prob'.$ARGV[0]} (splice @ARGV,1)