Реализации алгоритмов/Бинарный алгоритм вычисления НОД: различия между версиями

Реализации на Pascal, Perl, Scala перенесены из ../Алгоритм Евклида.
(Отмена правок до редакции 51022.)
(Реализации на Pascal, Perl, Scala перенесены из ../Алгоритм Евклида.)
{{wikipedia |Бинарный алгоритм нахождениявычисления НОД}}
{{wikipedia|Наибольший общий делитель}}
== Реализации бинарного алгоритма нахождения НОД ==
{{wikipedia|Бинарный алгоритм нахождения НОД}}
 
=== С ===
 
<source lang="c">
{
int shift;
 
/* GCD(0,x) := x */
if (u == 0 || v == 0)
return u | v;
 
/* Let shift := lg K, where K is the greatest power of 2
dividing both u and v. */
v >>= 1;
}
 
while ((u & 1) == 0)
u >>= 1;
 
/* From here on, u is always odd. */
do {
while ((v & 1) == 0) /* Loop X */
v >>= 1;
 
/* Now u and v are both odd, so diff(u, v) is even.
Let u = min(u, v), v = diff(u, v)/2. */
v >>= 1;
} while (v != 0);
 
return u << shift;
}
</source>
 
=== C# ===
 
<source lang="csharp">
</source>
 
=== Pascal/Delphi ===
 
<source lang="pascal">
function GCD(a, b: integer): integer;
begin
if (a = 0) then
begin GCD:= b
else if b Result:= b;0 then
Exit;GCD:= a
end else if a = b then
if (b = 0)GCD:= thena
else if (a mod 2 = 01) andor (b mod 2 = 01) then
begin
ResultGCD:= a;1
else if (a mod 2 = 0) and (b mod 2 <>= 0) then
Exit;
ResultGCD:= 2*GCD(Trunc(a/ div 2), Trunc(b/ div 2));
end else
else if (a mod 2 = 0) and (b mod 2 <> 0) then
ResultGCD:= GCD(Trunc(a/ div 2), b);
begin
else if (a mod 2 <> 0) and (b mod 2 = 0) then
Result:= a;
Exit;GCD:= GCD(a, b div 2)
end else
if (a GCD:= 1) or GCD(b, =1)abs(a then- b));
begin
Result:= 1;
Exit;
end else
if (a mod 2 = 0) and (b mod 2 = 0) then
begin
Result:= 2*GCD(Trunc(a/2), Trunc(b/2));
Exit;
end else
if (a mod 2 = 0) and (b mod 2 <> 0) then
begin
Result:= GCD(Trunc(a/2), b);
Exit;
end else
if (a mod 2 <> 0) and (b mod 2 = 0) then
begin
Result:= GCD(a, Trunc(b/2));
Exit;
end;
Result:= GCD(b, Abs(a - b));
end;
</source>
 
== Perl ==
[[Категория:Алгоритмы]]
 
<source lang="perl">
sub nod
{
return $_[0] if $_[1] == 0;
return $_[1] if $_[0] == 0;
($u, $v)=@_; $g=1;$t=100;
while (1)
{
if ($u%2==1 || $v%2==1) {last;};
$u>>=1; ##(right shift)
Result:$v>>= a1;
$g<<=1; ## (left shift)
}
 
while ($u > 0)
{
if ($u%2==0 && $u>0) {$u = $u>>1;}
elsif ($v%2==0 && $v>0) {$v = $v>>1;}
end else
Exit; {
$t = abs (($u-$v)/2);
if ($u < $v) {$v = $t;} else {$u = $t;}
Exit; }
}
return $v*$g;
}
</source>
 
== Scala ==
<!-- Добавил Рыжий Лис red-fox0@mail.ru -->
<source lang="scala">
def GCD(a:BigInt, b:BigInt):BigInt = {
if (a == 0) return b;
if (b == 0) return a;
if (a == b) return a;
if (a == 1 || b == 1) return 1;
if ((a % 2 == 0) && (b % 2 == 0)) return 2 * GCD(a / 2, b / 2);
if ((a % 2 == 0) && (b % 2 != 0)) return GCD(a / 2, b);
if ((a % 2 != 0) && (b % 2 == 0)) return GCD(a, b / 2);
Result:= return GCD(b, Abs(a - b).abs);
}
</source>
 
{{BookCat}}
3891

правка