#! perl -slw use strict; use List::Util qw[max]; use Quantum::Superpositions UNARY => ['CORE::int']; use Benchmark qw[cmpthese]; sub pl_all{ $_ || return 0 for @_; 1 } sub PL_is_prime{ $_[0]==2 || pl_all map{ $_[0] % $_ } 2..sqrt($_[0])+1 } sub QS_is_prime{ $_[0]==2 || $_[0] % all(2..sqrt($_[0])+1) != 0 } our ($QS_count, $PL_count); cmpthese( -1, { 'Q::S' => q[ $QS_count = 0; $QS_count += QS_is_prime($_) ? 1 : 0 for 2..10000; ], 'perl' => q[ $PL_count = 0; $PL_count += PL_is_prime($_) for 2..100000; ], }); print "Primes found: Q::S:$QS_count; Perl:$PL_count\n\n"; sub QS_factors { eigenstates (int($_[0] / any(2..$_[0]-1)) == ($_[0] / any(2..$_[0]-1))); } sub PL_factors{ grep{ $a = $_[0]/$_; int($a) == $a } 2 .. $_[0] - 1; } our (@QS_factors, @PL_factors); cmpthese( -1, { QS_factors => q[ $a=1; @QS_factors = QS_factors($_) for map{$a *= $_} 2 .. 6; ], PL_factors => q[ $a=1; @PL_factors = PL_factors($_) for map{$a *= $_} 2 .. 9; ], }); print "qs:\n@QS_factors\npl:\n@PL_factors\n"; sub QS_GCD{ my ($x, $y) = @_; my $common = all(any(QS_factors($x)), any(QS_factors($y))); any(eigenstates $common) >= all(eigenstates $common); } sub PL_GCD{ my ($x, $y) = @_; my %any; max grep{ ++$any{$_} > 1 } PL_factors($x), PL_factors($y); } our ($QS_GCD, $PL_GCD); cmpthese( -20, { QS_GCD => q[ $a=$b=1; $QS_GCD = QS_GCD($a=$b, $b *= $_) for 2 .. 6; ], PL_GCD => q[ $a=$b=1; $PL_GCD = PL_GCD($a=$b, $b *= $_) for 2 .. 9; ], }); print "QS:$QS_GCD - PL:$PL_GCD" #### D:\Perl\test>qs-test s/iter Q::S perl Q::S 282 -- -98% perl 4.87 5702% -- Primes found: Q::S:1229; Perl:1229 s/iter QS_factors PL_factors QS_factors 322 -- -100% PL_factors 0.120 267905% -- qs:90 80 2 48 180 360 18 72 30 144 16 6 240 120 3 36 40 9 12 15 20 8 4 60 24 45 10 5 pl:2 3 4 5 6 8 9 10 12 15 16 18 20 24 30 36 40 45 48 60 72 80 90 120 144 180 240 360 s/iter QS_GCD PL_GCD QS_GCD 336 -- -100% PL_GCD 0.148 226174% -- QS:60 - PL:60