Greatest common divisor: Difference between revisions

Content added Content deleted
(Updated D entry)
(→‎{{header|Perl}}: Add modules, update timing)
Line 2,037: Line 2,037:
return $u * $k;
return $u * $k;
}</lang>
}</lang>

===Modules===
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
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===
===Notes on performance===
<lang perl>use Benchmark qw(cmpthese);
<lang perl>use Benchmark qw(cmpthese);
use Math::BigInt;
use Math::Pari;
use Math::Prime::Util;


my $u = 40902;
my $u = 40902;
my $v = 24140;
my $v = 24140;
cmpthese(-5, {
cmpthese(-5, {
'gcd' => sub { gcd($u, $v); },
'gcd_rec' => sub { gcd($u, $v); },
'gcd_iter' => sub { gcd_iter($u, $v); },
'gcd_iter' => sub { gcd_iter($u, $v); },
'gcd_bin' => sub { gcd_bin($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>
});</lang>


Output on 'Intel(R) Pentium(R) 4 CPU 1.50GHz' / Linux / Perl 5.8.8:
Output on 'Intel i3930k 4.2GHz' / Linux / Perl 5.20:
<pre>
<pre>
Rate gcd_bin gcd_iter gcd
Rate gcd_bigint gcd_bin gcd_rec gcd_iter gcd_pari gcd_mpu
gcd_bin 321639/s -- -12% -20%
gcd_bigint 39939/s -- -83% -94% -95% -98% -99%
gcd_iter 366890/s 14% -- -9%
gcd_bin 234790/s 488% -- -62% -70% -88% -97%
gcd 401149/s 25% 9% --
gcd_rec 614750/s 1439% 162% -- -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>
</pre>

===Built-in===
<lang perl>use Math::BigInt;

sub gcd($$) {
Math::BigInt::bgcd(@_)->numify();
}</lang>


=={{header|Perl 6}}==
=={{header|Perl 6}}==