#!/usr/local/bin/perl -w use strict; $|=1; no strict 'refs'; use POSIX; use Math::BigInt; sub prob28 { sub toverbose { my $b = @_; '$'. join ('+', map { $b-- ; $_ . ($b == 0 ? '' : '\cdot 26' . ($b == 1 ? '' : '^'.$b)); } @_) .'$' } sub e_rsa { my ($n, $e, $bl) = splice @_,0,3; my @ptBs = split //, shift; my @ctBs; print "\\begin{tabular}{lclclclcl}\n"; for my $i (0..@ptBs/$bl-1) { my @b = map { print $_; ord ($_) - ord ('a')} splice @ptBs, 0, $bl; print '&$\rightarrow$&'; my $b = @b; print '$(', join (',', @b), ')$&$\rightarrow$&$x_', $i+1, '$ &$=$& ', toverbose (@b); my $blockVal; $blockVal += 26**(@b-1-$_) * $b[$_] for 0..@b-1; push @ptBs, $blockVal; print '&=&', $blockVal, "\\\\\n"; } print "\\end{tabular}\n"; print "\\begin{tabular}{lcrcrcrcl}\n"; for (0..@ptBs-1) { my $t = $ptBs[$_]**$e%$n; print '$y_{', $_+1, '}$&$=$&$', $ptBs[$_], '^{', $e, '} \mod ', $n, '$&$=$&', $t, ' &$\rightarrow$& '; @_ = (); while ($t) { my $l = $t % 26; $t /= 26; push @_, $l } @_ = reverse @_; my $ct = join '', map { uc chr $_ + ord 'a' } @_; print toverbose (@_), ' &$\rightarrow$& ', $ct, "\\\\\n"; push @ctBs, $ct } print "\\end{tabular}\n\n"; return join ' ', @ctBs } print 'Chiffretext : \textbf{', e_rsa (new Math::BigInt (11413), new Math::BigInt(3533), new Math::BigInt(2), "anrufumelf"), "}\n"; } sub prob29 { sub witness { my ($a, $n) = @_; my @b = split //, sprintf "%b", $n-1; my $d = 1; for (0..@b-1) { my $x = $d; $d = ($d * $d) % $n; return 2 if $d == 1 and $x != 1 and $x != $n-1; $d = $d * $a % $n if $b[$_] } return 1 if $d != 1; 0 } my ($ones, $twos) = '0'x2; for my $a (1..341) { if (witness ($a, 341)==1) { print "Witness $a gibt 1 zurück\n" if (witness ($a, 341)==1); $ones++; } if (witness ($a, 341)==2) { print "Witness $a gibt 2 zurück\n" if (witness ($a, 341)==2); $twos++; } } print "Es existieren $ones Zeugen die 1 provozieren". " und $twos Zeugen die 2 provozieren\n"; } sub prob32 { my $n = 12; do { ++$n; while (witness (2, $n) or witness (3, $n)) { ++$n } } while not witness (5, $n); print $n, "\n" } &{'prob'.$ARGV[0]} (splice @ARGV,1)