Greatest common divisor: Difference between revisions

→‎{{header|Perl}}: Add modules, update timing
(Updated D entry)
(→‎{{header|Perl}}: Add modules, update timing)
Line 2,037:
return $u * $k;
}</lang>
 
===Built-inModules===
All three modules will take large integers as input, e.g.
<tt>gcd("68095260063025322303723429387", "51306142182612010300800963053")</tt>. Other possibilities are Math::Cephes euclid, Math::GMPz gcd and gcd_ui.
<lang perl># Fastest, takes multiple inputs
use Math::Prime::Util "gcd";
$gcd = gcd(49865, 69811);
 
# In CORE. Slowest, takes multiple inputs, result is a Math::BigInt unless converted
<lang perl>use Math::BigInt;
$gcd = Math::BigInt::bgcd(@_49865, 69811)->numify();
 
# Result is a Math::Pari object unless converted
use Math::Pari "gcd";
$gcd = gcd(49865, 69811)->pari2iv
}</lang>
 
===Notes on performance===
<lang perl>use Benchmark qw(cmpthese);
use Math::BigInt;
use Math::Pari;
use Math::Prime::Util;
 
my $u = 40902;
my $v = 24140;
cmpthese(-5, {
'gcdgcd_rec' => sub { gcd($u, $v); },
'gcd_iter' => sub { gcd_iter($u, $v); },
'gcd_bin' => sub { gcd_bin($u, $v); },
'gcd_bigint' => sub { Math::BigInt::bgcd($u,$v)->numify(); },
'gcd_pari' => sub { Math::Pari::gcd($u,$v)->pari2iv(); },
'gcd_mpu' => sub { Math::Prime::Util::gcd($u,$v); },
});</lang>
 
Output on 'Intel(R) Pentium(R)i3930k 4 CPU 1.50GHz2GHz' / Linux / Perl 5.8.820:
<pre>
Rate gcd_bigint gcd_bin gcd_iter gcd_rec gcd_iter gcd_pari gcdgcd_mpu
gcd_bingcd_bigint 321639 39939/s -- -1283% -94% -95% -98% -2099%
gcd_itergcd_bin 366890 234790/s 14 488% -- -962% -70% -88% -97%
gcdgcd_rec 401149614750/s 251439% 9162% -- -23% -68% -91%
gcd_iter 793422/s 1887% 238% 29% -- -58% -89%
gcd_pari 1896544/s 4649% 708% 209% 139% -- -73%
gcd_mpu 7114798/s 17714% 2930% 1057% 797% 275% --
</pre>
 
===Built-in===
<lang perl>use Math::BigInt;
 
sub gcd($$) {
Math::BigInt::bgcd(@_)->numify();
}</lang>
 
=={{header|Perl 6}}==
Anonymous user