Иллюстрированный самоучитель по Mathematica 5

Линейное представление наибольшего общего делителя (функция ExtendedGCD)

Честно говоря, возникает желание избавиться от этого назойливого повторения. Как это сделать? Для этого придется переделать программу. Но чтобы программа не была слишком длинной, лучше переписать ее. Прежде всего, к уже имеющимся определениям:

aaa[a_, n_] := a ^ n - 1;
d := GCD[n, m]

Добавим еше два для печати.

prnt := {Print["###",n, ":",m,":",d,":",a,":"],
If[g<0,Print["-"]],
Print[IntegerDigits[g,a],":"],
If[r<0,Print["-"]],
Print[IntegerDigits[r,a],":"],
If [s<0-. Print ["-"] ],
Print[ IntegerDigits [s, a] ] };
prnt1 := {Print["%%%",n,":",m,":",d,":"],
If[r<0, Print["-"]],
Print[FromDigits!IntegerDigits[r,a],10],":"],
If[s<0,Print!"-"]];
Print[FromDigits[IntegerDigits[s,a],10]]);

Основным определением здесь является prntl. Именно это определение используется для первого вывода на печать значений n, m, d = НОД(n, m), а также двоичных представлений rus. Чтобы облегчить распознавание определения, которое выполняет печать, в основном определении (prntl) ведущими символами являются ###, а во вспомогательном (prnt) – %%%. Используя вспомогательное определение prnt, предыдущую программу можно переписать так.

Do[
Do[
Do[{{g,{r,s)}=ExtendedGCD[aaa[a,n],aaa[a,m]], prnt},
{a,2,n+m+2}], {m,n-1}], {n,10}]

Вспомогательное определение prnt будет использоваться для первого вывода на печать только тех представлений г и s, которые отличаются от первого. Поэтому в этом определении предусмотрен вывод дополнительной информации: представления g и основания системы счисления а.

Теперь программу можно модифицировать с учетом нового определения функции печати. Возникает соблазн написать программу так.

Do[
Do[{
Do[{{g,{r,s}}=ExtendedGCD[aaa[a,n],aaa[a,m]],
If[a==2,{{g0,{r0,s0}}={g,(r,s)}, prnt1}],
If[{g0,{r0,s0}}!={g,{r,s}},prnt]},{a,2,n+m+2}]},{m,n-1}],{n,10}]

Но это совсем не то, что мы хотели! Ведь условие {g0, {r0, s0}}! = {g, {r, s}} будет выполнено при а! =2. Все дело в том, что значения ms зависят от основания системы счисления а\ Не зависит от основания системы счисления а лишь их представление в системе счисления с основанием а. Поэтому проверять нужно именно неизменность представления в системе счисления с основанием а. Кроме того, проверка g0! =n лишняя. Поэтому лучше добавить еще одно определение.

newrs := {Signfr0], Signts0], IntegerDigits[r0.2], IntegerDigits[s0.2]} != {Sign[r], Sign[s], IntegerDigits[r, a], IntegerDigits[s, a]}

Теперь можно записать программу.

Do[
Do [{
Do[{{g,{r,s}}=ExtendedGCD[aaa[a,n],aaa[a,m]],
If[a==2,{ {r0,s0}={r,s}, prnt1}], If[newrs,prnt]},
{a,2,n+m+2H }, {m,n-1} ]; {n,20}]
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.