344
правки
Изменения
м
→Наивный алгоритм
В наивном методе, мы считаем, что нам известны разложения чисел <tex>a</tex> и <tex>b</tex> на простые множители.
<font color=green"darkgreen">// <tex>p</tex> {{---}} множество простых чисел в разложении <tex>a</tex></font> <font color=green> // <tex>q</tex> {{---}} множество простых чисел в разложении <tex>b</tex></font> <font color=green> // <tex>\alpha</tex> {{---}} степени простых чисел в разложении <tex>a</tex></font> <font color=green> // <tex>\beta</tex> {{---}} степени простых чисел в разложении <tex>b</tex></font> '''function''' <tex>\mathtt{naiveGcd}(p, q, <tex>\alpha</tex>, <tex>\beta):</tex>): gcd <tex>\mathtt{gcd} \leftarrow 1</tex>1 i, j <tex>\mathtt{i, j} \leftarrow 0, 0</tex>0, 0 '''while''' <tex>\mathtt{i} < p\mathtt{.length()}</tex> '''and''' <tex>\mathtt{j} < q\mathtt{.length()}:</tex> '''if''' <tex>p_i</tex> == <tex> q_j:</tex>: t <tex>\mathtt{t} \leftarrow \</tex> min(<tex>\alpha_i, \beta_j)</tex> , <tex>\mathtt{beta_i</tex>) gcd} = \mathtt{gcd} <tex>\cdot </tex> <tex>p_i^{\mathtt{t}}</tex> '''else if''' <tex>p_i < /tex> < <tex>q_j:</tex>: <tex>\mathtt{ i} \mathrel{+}\mathrel{\mkern-2mu}= 1</tex> '''else''': <tex>\mathtt{ j} \mathrel{+}\mathrel{\mkern-2mu}= 1</tex> '''return''' <tex>\mathtt{gcd}</tex>
Корректность алгоритма следует из того, что он по сути просто делает пересечение двух упорядоченных массивов (<tex>p</tex> и <tex>q</tex>), только результат записывает не в массив, а агрегирует в переменной <tex>\gcd</tex>. Асимптотика равна минимуму из длин массивов <tex>p</tex> и <tex>q</tex>.