uebung10.plsrc


#!/usr/local/bin/perl
use strict; no strict 'refs'; use Math::BigInt;

sub modexp {
  my ($a, $b, $n) = @_;
  my $d = new Math::BigInt (1);
  my @b = split //, sprintf "%0b", $b;
  for my $i (0..@b-1) {
    $d = $d*$d % $n;
    $d = $d*$a % $n if $b[$i]
  }
  $d    
}

sub k614 {
  my ($n, $m, @pt) = @_; my %r;
  for my $i (@pt) {
    modexp ($_, $m, $n) == 1 and modexp ($_, $m/$i, $n) != 1 and $r{$_}++ for 2..$n    
  }
  my @r = sort { $a <=> $b } map { $r{$_} == @pt ? $_ : () } keys %r;
  print scalar @r, "\n";
  @r;
}


sub prob36 {
  map { print join (", ", k614 ( map { new Math::BigInt ($_) } @{$_})), "\n" } 
    [2333, 53, 53], [2333, 22, 2, 11]
}

sub prob37 {
  my $p = 863; my $r;
  for (1..5000) {
    my $a = 1 + int rand $p-1;
    modexp ($a, 2, $p) != 1 and modexp ($a, 431, $p) != 1 and $r++
  }
  print $r, "\n";
}

&{'prob'.$ARGV[0]} (splice @ARGV,1)