#!/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)