Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Max Alekseyev                        2:5015/60      15 Sep 2001  19:15:12
 To : Azamat Kalimullin
 Subject : Получение коэффициентов.
 -------------------------------------------------------------------------------- 
 
 
 Replying to a message of Azamat Kalimullin to All:
 
  AK> Делал как-то свою курсовую и столкнулся с одной проблемой. Имеются два
  AK> числа A и B. Hужно найти такие коэффициенты x и y, чтобы A*x + B*y = 1.
  AK> Как говорится, долго дуамал. В итоге получилось:
  AK> Сначала x и y равны по единице.
  AK> Берем разность |A| - |B| = C
  AK> Если |C| < |B|, тогда C = C + |A|, увеличиваем x
  AK> Если |C| > |B|, тогда C = C - |B|, увеличиваем y
  AK> Если |C| = |B|, тогда считаем, что единицу получить нельзя, потому что     
  AK> получится ноль.
 
 [...]
 
  AK> И вопрос. А есть ли еще более просто решение?
 
 Есть. Все то же самое, только вместо вычитания используешь деление. И получаешь 
 в результате /расширенный алгоритм Евклида/.
 
 ===cut===
 Hахождение коэффициентов представления (n,m) = a*n + b*m
 
 Расширенный алгоритм Евклида:
 
 x_0 = n, x_1 = m, a_0 = 1, a_1 = 0, b_0 = 0, b_1 = 1
 
 y_i = [ x_{i-1} / x_i ]        ( [ ] - целая часть )
 x_{i+1} = x_{i-1} mod x_i = x_{i-1} - x_i * y_i
 a_{i+1} = a_{i-1} - a_i * y_i
 b_{i+1} = b_{i-1} - b_i * y_i
 
 Итерируешь (i=1,2,...) до тех пор, пока не получишь x_{k+1}=0. Тогда 
 a = a_k, b = b_k - искомые.
 
 P.S. Hа каждом шаге, естественно, нужно знать только два предыдущих члена. 
 Поэтому никакие массивы для вычислений не нужны.
 ===cut===
 
 ===cut===
 function gcd(m,n:longint;var a,b:longint):longint;
 var t,t2,a2,b2,u:longint;
 begin
       if m=0 then
       begin
         a:=0; b:=1;
         gcd:=n;
       end else
       begin
         a:=0; b:=1;
         a2:=1; b2:=0;
         repeat
           t:=n div m;
           t2:=m; m:=n mod m; n:=t2;
           u:=a2; a2:=a-t*a2; a:=u;
           u:=b2; b2:=b-t*b2; b:=u;
         until m=0;
         gcd:=n;
       end;
 end;
 ===cut===
 
 Regards,      ш.ш
         Max    ~
 
 --- FleetStreet 1.27.3.6
  * Origin:  (2:5015/60)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Получение коэффициентов.   Azamat Kalimullin   15 Sep 2001 13:53:08 
 Получение коэффициентов.   Max Alekseyev   15 Sep 2001 19:15:12 
 Re: Получение коэффициентов.   Ђ­¤аҐ©   16 Sep 2001 19:52:49 
 Получение коэффициентов.   Max Alekseyev   16 Sep 2001 09:53:12 
 Получение коэффициентов.   Azamat Kalimullin   17 Sep 2001 17:33:18 
 Re: Получение коэффициентов.   Ђ­¤аҐ©   17 Sep 2001 23:01:26 
 Re: Получение коэффициентов.   Ђ­¤аҐ© Љг¤апўжҐў   19 Sep 2001 09:39:22 
 Получение коэффициентов.   Max Alekseyev   19 Sep 2001 00:14:30 
 Получение коэффициентов.   Peter Tarakanov   19 Sep 2001 13:45:00 
 Получение коэффициентов.явцев   Azamat Kalimullin   19 Sep 2001 15:17:50 
 Получение коэффициентов.явцев   Azamat Kalimullin   19 Sep 2001 15:20:34 
 Получение коэффициентов.   Arseny Slobodjuck   17 Sep 2001 22:54:21 
 Получение коэффициентов.   Alex Cvetkov   16 Sep 2001 12:39:57 
 Получение коэффициентов.   Azamat Kalimullin   17 Sep 2001 17:36:02 
 Получение коэффициентов.   Yuri Burger   17 Sep 2001 20:21:43 
 Re: Получение коэффициентов.   Andrew Ezhguroff   20 Sep 2001 03:23:46 
 Получение коэффициентов.   Max Alekseyev   19 Sep 2001 17:01:16 
 Получение коэффициентов.   Ilia Kantor   27 Nov 2001 00:33:54 
Архивное /ru.algorithms/18133ba3ab4b.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional