File: totient-range.pl

package info (click to toggle)
libmath-prime-util-perl 0.73-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,796 kB
  • sloc: perl: 24,676; ansic: 11,471; makefile: 26; python: 24
file content (29 lines) | stat: -rwxr-xr-x 720 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env perl
use strict;
use warnings;
$| = 1;  # fast pipes

use Math::Prime::Util qw/euler_phi vecsum urandomm/;

my $limit = shift || 1_000_000;

print "Calculating totients from 1 to $limit...";
my @phi = map { euler_phi($_) } 1 .. $limit;
print "...";
unshift @phi, 0;
print "...done\n";

print "Running non-stop random tests.  Break when desired.\n";
while (1) {
  my $beg = urandomm($limit);
  my $end = urandomm($limit);
  ($beg,$end) = ($end,$beg) if $beg > $end;

  # Does range return the same values?
  my $sum1 = vecsum(  @phi[ $beg .. $end ]  );
  my $sum2 = vecsum(  euler_phi($beg,$end)  );

  warn "\nbeg $beg  end $end  sum $sum1  range sum $sum2\n"
       unless $sum1 == $sum2;
  print ".";
}