Главная страница «Первого сентября»Главная страница журнала «Математика»Содержание №21/2009

Микрокалькулятор – друг или враг?

В эпоху «всеобщей компьютеризации» жизнь школьного преподавателя математики скорее усложнилась, чем упростилась. Использовать компьютер в учебном процессе непросто. Есть сейчас и электронные учебники, и математические программы, и специальные геометрические программы, но они дороги и сложны. Да и проку от них немного. Гораздо полезнее учить школьников самостоятельно программировать, но и это непросто, не всех легко научить, да и заниматься этим естественнее на уроках информатики, а не математики. Кроме того, компьютер — вещь недешевая, и он есть не у всех. Поэтому чаще применяются калькуляторы, в основном для ускорения вычислений при выполнении учебных заданий. Но использование калькуляторов привело к тому, что многие школьники уже не умеют считать без их помощи. Впрочем, на калькуляторе они умеют делать только простейшие вычисления. Все же с помощью калькулятора решение задач облегчается, что привело к запрету на использование калькуляторов во время экзаменов.

В популярном фильме сказано: «Кто нам мешает, тот нам поможет». Почему бы не использовать калькулятор с целью повышения интереса к математике путем решения задач, в которых школьники учились бы самостоятельно придумывать вычислительные алгоритмы, обходясь при этом минимальными средствами (используя простейшие калькуляторы), и находить среди массы вариантов наилучшее в том или ином смысле решение («оптимизация программ»). Для этого нужны задачи, для решения которых надо вначале подумать, а потом нажимать кнопки. Конечно, здесь не идет речь о реальном программировании, но и для обучения программированию это тоже будет полезно. Кроме того, это дает естественный повод для знакомства с интересными чисто математическими вопросами, который иначе вряд ли бы представился. Чтобы не быть голословным, приведу примеры.

Недокументированные возможности простейшего микрокалькулятора и вычисление чисел Фибоначчи

Последовательность чисел Фибоначчи, возможно, одна из самых популярных в математике и ее приложениях, и о ней написано во множестве книжек (есть даже специальные книжки, посвященные ей). Как известно, она начинается с двух единиц, а потом каждое следующее число вычисляется как сумма предыдущих. Конечно, легко эту последовательность вычислять на любом калькуляторе, но быстрее и удобнее всего это делать на простейших калькуляторах, воспользовавшись одним их «недокументированным» свойством. А именно, введем число 1 на дисплей, нажав соответствующую кнопку, потом нажмем кнопку «Плюс», дальше кнопку «Равно» и будем повторять эту последовательность действий, нажимая кнопки «+», «=», «+», «=»... (не вводя больше никаких чисел на дисплей с клавиатуры). При этом на дисплее будут последовательно появляться все числа Фибоначчи: 2, 3, 5, 8, 13, 21, 34, 55, 89... Почему так будет? Ведь если ввести на дисплей число, нажать кнопку «Умножение», а потом кнопку «Равно», то число просто возводится в квадрат. Повторение этой пары операций опять приведет к возведению в квадрат и т.д. Если же ввести число и нажать кнопку «Сложение», а потом, не вводя второго слагаемого, нажать кнопку «Равно», то, казалось бы, число должно удвоиться — ан нет, число останется без изменения, никакое действие не будет выполнено. Но так работают только достаточно дорогие калькуляторы. А дешевый калькулятор просто прибавит число, выведенное на дисплей, к числу, которое у него хранится в памяти, то есть результату предыдущего вычисления (но содержимое этой ячейки памяти иногда бывает недоступно, и вызвать его на дисплей нельзя). Поэтому если на дисплее в какой-то момент появилось число Фибоначчи Fn, а в предыдущий момент было Fn – 1, то в следующий момент появится число F+ 1. Кстати, если поделить число Fn + 1 на предыдущее, то получится с высокой точностью число известное как «золотое сечение» (об этом числе и о его роли в науке и искусстве тоже написаны горы книг).

Указанный способ последовательного вычисления чисел Фибоначчи является, вероятно, самым быстрым. На более дорогих калькуляторах вычисление выполняется чуть медленнее, так как надо регулярно заносить полученный на экране результат в память калькулятора и одновременно извлекать из памяти предыдущий результат (для этого есть специальная кнопка, обменивающая содержимое ячейки памяти и регистра). Но как быть, если мы хотим быстро найти только одно число Фибоначчи, например F1000? Для этого можно воспользоваться известной формулой

Эта удивительная формула выражает целое число через иррациональное число ф. Так как модуль второго слагаемого меньше и к тому же с ростом n быстро стремится к нулю, то для вычисления Fn достаточно только вычислить и округлить до ближайшего целого. При n, равном нескольким десяткам, калькулятор сделает это сам, так как погрешность его вычислений просто окажется больше, чем величина второго слагаемого, и на дисплее в качестве результата появится натуральное число (впрочем, если n слишком велико, то результат не уместится в калькуляторе; что делать в этом случае, обсудим позднее).

Но как возвести на калькуляторе число a, например, в тысячную степень, если у него нет специальной операции возведения в произвольную степень? Умножать 999 раз не нужно, а можно выполнить следующую последовательность действий:

a 3 = a2aa, a7 = (a3)2aa, a15 = (a7)2a, a31 = (a15)2a,

a 62 = (a31)2, a125 = (a62)2a, a250 = (a125)2,

a 500 = (a250)2, a1000 = (a500)2.

Если вспомнить, что 1000 имеет двоичную запись 1111101000, то можно заметить, что если отбросить старший бит (всегда равный единице), то каждому следующему биту соответствует операция возведения в квадрат, если он нулевой, или возведения в квадрат с последующим умножением на число a — основание степени (то есть делается две операции). Кстати, число a не нужно каждый раз заново набирать на клавиатуре. Нужно в самом начале вычислений занести его в память калькулятора, и, когда нужно, после нажатия кнопки умножения просто вызывать его из памяти и нажимать кнопку «Равно». Таким образом, возведение в квадрат требует двукратного нажатия кнопок, а возведение в квадрат и последующее умножение на основание степени — пятикратного. Для того, чтобы не запутаться в операциях, можно перед началом вычислений составить мнемоническое правило. Возведение в квадрат обозначим символом К, а возведение в квадрат и последующее умножение — символом КУ. Тогда, заменяя в двоичной записи единицы (кроме старшей) на КУ, а нули — на К, получим правило КУКУКУКУККУККК, или короче КУ4ККУК3. Данное правило возведения в степень является частным случаем так называемого бинарного метода.

Задача нахождения минимального числа умножений, необходимых для возведения числа a в данную степень m, приводит к задаче о нахождении так называемых кратчайших аддитивных цепочек. Аддитивной цепочкой называют любую начинающуюся с 1 последовательность натуральных чисел a0 = 1, a1, ..., am, в которой каждое число является суммой каких-то двух предыдущих чисел (или удвоением какого-то предыдущего числа). Длиной цепочки a0 = 1, a1, ..., am называем число m. Наименьшую длину аддитивной цепочки, заканчивающейся числом n, обозначают l(n). Например, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 — аддитивная цепочка, 1, 2, 3, 5, 7, 14 — минимальная цепочка для 14, то есть l(14) = 5. Читатель может попробовать сам доказать, что log2 n l(n) 2log2 n. Указанная верхняя оценка как раз и получается с помощью бинарного метода построения аддитивных цепочек. Теория аддитивных цепочек, несмотря на свою элементарность, еще далека от ответа на многие возникшие в ней естественные вопросы. Например, бинарный метод не самый быстрый из известных, есть и более быстрые, но наилучший метод неизвестен.

Если нам нужно вычислить xy для произвольного числа на калькуляторе, в котором нет такой операции, то ее можно выполнить приближенно с помощью бинарного метода. Число y (приближенно) запишем в виде двоичной дроби an...a0,a–1...am, представим ее в виде обыкновенной дроби вычислим xa, например, бинарным методом, а потом m раз подряд извлечем квадратный корень (на многих дешевых калькуляторах такая операция есть). Как приближенно возводить число в степень на калькуляторе без квадратного корня, будет рассказано далее.

Заметим еще, что для быстрого вычисления больших чисел Фибоначчи можно использовать следующий прием, несколько менее быстрый, но интересный тем, что в нем вычисления проводятся только с натуральными числами (и не требующий знаний явной формулы для чисел Фибоначчи). Он основан на том, что если уже вычислена пара чисел (Fk; Fk – 1), то пару (Fk; Fk + 1) находим одним сложением, а пару

находим еще шестью операциями, и применяем описанный выше бинарный метод.

Можно показать, что число калькуляторных операций для вычисления Fn не превосходит C log2 n.

Вычисления с длинными числами

Как бы мы ни вычисляли числа Фибоначчи, начиная примерно с F50, они станут настолько большими, что перестанут помещаться на дисплее в точном виде. На дешевых калькуляторах попытка их вычислить приведет к переполнению, и на дисплее появится информация об этом, на дорогих калькуляторах результат будет представлен в экспоненциальной форме, через порядок и мантиссу. Но как быть, если очень хочется получить точное значение? Тогда придется использовать только что описанный метод вычисления пар соседних чисел Фибоначчи, но при этом выполнять арифметические действия с длинными числами. Конечно, эти действия уже нельзя выполнить одним нажатием кнопки. Нужно будет вспомнить алгоритмы школьной арифметики: сложение и умножение столбиком. Калькулятор и здесь может помочь. Например, если мы имеем десятиразрядный калькулятор, то для сложения (или вычитания) длинных чисел нужно представить их в виде записи числа в системе счисления по основанию 109, то есть обычную десятичную дробь разбить справа налево на блоки из 9 подряд идущих цифр (в самом левом блоке цифр может быть меньше), эти блоки рассматривать как записи чисел в пределах от нуля до 109 – 1 = 999 999 999, тогда полученные числа будут «цифрами» в системе счисления по основанию 109. Алгоритмы сложения-вычитания в этой системе ничем не отличаются от обычной десятичной системы. Для сложения-вычитания цифр можно использовать калькулятор. Если полученный результат будет десятиразрядным, то его старшая цифра (обязательно единица) используется для переноса в следующий разряд. Конечно, описанная операция сложения-вычитания будет для длинных чисел трудоемкой, но использование калькулятора ускоряет ее выполнение почти в десять раз. Для умножения длинных чисел придется воспользоваться системой счисления по основанию 105, чтобы результат умножения «цифр» помещался в калькуляторе. Младшие пять цифр такого умножения записываются как промежуточный результат, а старшие цифры образуют перенос в следующий разряд. Разумеется, умножение длинных чисел (даже с помощью калькулятора) более трудоемкая операция, чем сложение. Еще более сложно выполняется деление длинных чисел, хотя и здесь можно использовать систему счисления по основанию 105 и калькулятор.

Удивительно, но школьные алгоритмы умножения и деления в позиционной системе счисления не являются ни единственно возможными, ни даже самыми быстрыми. В шестидесятые годы прошлого века были изобретены более быстрые алгоритмы для операций с длинными числами, и работа по их совершенствованию продолжается и сейчас. Самый простой из них (придуманный А.А. Карацубой) можно было бы изложить и здесь, но мы все же отошлем читателя к специальной литературе (например, книге Гашкова и Чубарикова «Арифметика. Алгоритмы. Сложность вычислений», изд. «Дрофа», 2005). Дело в том, что этот алгоритм начинает обгонять по скорости обычный школьный приблизительно с десятиразрядных чисел. Значит, если использовать, как указано выше, для умножения систему счисления по основанию 105, то числа с пятьюдесятью десятичными цифрами лучше все же умножать обычным школьным алгоритмом.

Может показаться, что мы слишком много внимания уделили такому специальному вопросу, как арифметические операции с длинными числами. На практике (не только школьной, но и инженерной) уже десятиразрядная точность является, как правило, избыточной. Например, использование десяти точных знаков после запятой в числе p позволяет вычислить длину окружности с диаметром 15 тысяч километров (а это больше диаметра Земли) с точностью до сантиметров.

Лет сорок назад это замечание было бы справедливым. Но в середине семидесятых годов почти одновременно и независимо группой американских математиков (Диффи, Хеллман, Райвест, Шамир, Эдлимэн) и группой английских криптографов (Кокс, Уильямсон, Эллис) были открыты первые алгоритмы криптографии с открытым ключом 1. Благодаря этим алгоритмам теперь частные лица могут обмениваться секретной информацией по общедоступным каналам связи (например, интернету) без боязни, что их сообщения прочтут не только конкуренты, но и спецслужбы. Возникшее направление в криптографии быстро превратилось в популярную область математических исследований, которой уже посвящены многочисленные журналы и книги. И во многих самых распространенных алгоритмах важную роль играет операция возведения в огромную степень огромных чисел (конечно, она выполняется на компьютерах, а не на калькуляторах).

Как решать квадратные уравнения на калькуляторе?

Казалось бы, вычислить корни по известным формулам

не составляет труда. Но возникает вопрос: как сделать это наиболее быстро? Точнее, как минимизировать число нажатий кнопок калькулятора? Если коэффициенты p, q достаточно большие, то много времени будет тратиться на ввод этих чисел в калькулятор, поэтому желательно вводить эти числа только один раз. Неочевидно, можно ли вообще придумать такое вычисление. Но сделать это можно, например следующим образом (может, ваши ученики придумают более эффективный алгоритм?): вводим p, делим его на 2, меняем знак и заносим в память калькулятора (далее подобную операцию обозначаем ), оставшееся на дисплее возводим в квадрат, вычитаем q и извлекаем из корень и меняем местами числа на дисплее и в памяти с помощью соответствующей кнопки «↔»: Тогда на дисплее опять появляется число а в память помещается число После этого к числу на дисплее прибавляется число из памяти, и получаем на дисплее корень x1, а если из x1 отнять два раза число из памяти, получим x2.

Но многие простейшие калькуляторы операции ««» обмена числа в регистре с числом в памяти не имеют. Как быть? Эту операцию можно выполнить, например, как следующую последовательность простейших операций (не вводя никаких чисел в калькулятор руками):

(здесь и далее xR означает число в регистре, именно оно отображается на дисплее, а yM означает число в памяти; перед состоянием памяти или регистра указана операция или последовательность операций, которая приводит к этому состоянию).

А как решать уравнение в общем виде ax2 + bx +c = 0? В этом случае можно, например, свести задачу к уже рассмотренной, выполнив следующую последовательность операций:

(последняя операция имеется не у всех простейших калькуляторов). После этого в памяти оказывается q, а на дисплее p. Приведенную выше «программу» решения квадратного уравнения x2 + px + q = 0 тогда придется модифицировать (как — это тоже хорошая задача).

Любой подобный способ решения уравнений на калькуляторе на самом деле дает, вообще говоря, приближенное решение. Как быть, если ответ в задаче нужно получить точный? Если корень — целое число, то оно и получится. Если корень — рациональное число, то ответ получится приближенный, скорее всего — с ошибкой в последнем знаке, и по нему нужно будет определять точный ответ. Для этого можно, например, найти период и предпериод рациональной дроби, приближением к которой является полученный ответ, а потом конвертировать эту бесконечную десятичную дробь в простую дробь. Формальное описание и доказательство корректности этого алгоритма не так уж просто и ведет к интересным вопросам элементарной арифметики, обычно не изучаемым в школе.

Если корень является квадратичной зависимостью, то понять, чему он равен, глядя на дисплей калькулятора, весьма непросто. Один из возможных способов — разложение результата в цепную дробь, что можно сделать на калькуляторе (кстати, как — это тоже хорошая задача), и использование теоремы Лагранжа о периодичности цепных дробей для квадратичных иррациональностей (об этой теореме можно прочесть во многих книгах по элементарной теории чисел, например в упоминавшейся книге «Арифметика. Алгоритмы. Сложность вычислений»). Но это стрельба из пушки по воробьям. В этом случае надо просто вычислить отдельно дискриминант и коэффициент и выписать ответ. При этом возникает другая интересная задача — минимизация длины записи корней квадратного уравнения. Дело в том, что запись корней в виде

в том случае, когда установлено, что D = b2 – 4ac не является полным квадратом, хотя формально правильна, но может иногда быть записана в более компактном виде

где P, S, Q и R — некоторые делители чисел b, D = b2 – 4ac и 2a соответственно. Естественно в этом случае найти наиболее компактную запись. Подобные задачи возникают перед создателями символьных вычислений компьютерной алгебры. Написать программу для компьютера или программируемого калькулятора, которая всегда будет это делать правильно, не так уж и просто, и мы предлагаем читателям убедиться в этом самостоятельно. Например, для вычисления наибольшего общего делителя придется применить алгоритм Евклида, а для выделения максимального квадрата — дискриминант разлагать на простые множители.

Как вычислять элементарные и неэлементарные функции на простейшем калькуляторе?

Если калькулятор не умеет вычислять корни, его можно этому научить. Для вычисления квадратного корня применяются итерации

Для вычисления они принимают вид

Если то простейшее наилучшее приближение есть 0,5903N + 0,4173. После этого уже две итерации дают 9 десятичных знаков после запятой.

Если 0,1 N 10, то в качестве приближения с точностью можно взять

Представляют интерес также задачи следующего вида. Например, как, имея x в регистре, а y в памяти, получить x + y в регистре и xy в памяти. Это можно сделать, например, следующим образом. Сначала получим yxR, x + y M, например, так:

x R, y M; x + y R, y M;

y R, x + y M;

2y R, x + y M;

yx = 2y – (x + y) R, x + y M.

Используя эту «подпрограмму», выполняем следующие операции:

x R, y M; yx R, x + y M;

(yx)2 R, x + y M;

x + y R, (yx)2 M; (x + y)2 R, (yx)2 M;

4xy = (x + y)2 – (xy)2 R, (yx)2 M;

4xy R, (x + y)2 = (yx)2 + 4xy M;

xy R, (x + y)2 M; (x + y)2 R, xy M;

Используя эту «программу», легко получить, например, «программу», которая переводит «состояние калькулятора» x R, y M в состояние то есть «одновременно» вычисляет среднее арифметическое и среднее геометрическое двух заданных чисел. Многократно повторяя эту «программу», можно получить две рекуррентные последовательности:

Наблюдая за их поведением, можно заметить, что они очень быстро сходятся к общему пределу, который зависит от выбора начальных значений x1 = a, y1 = b. Этот предел представляет собой некоторую функцию AGM(a; b), которая называется арифметико-геометрическое среднее Гаусса. Существование этого предела доказать несложно, а быструю сходимость к нему — сложнее. Но самое интересное то, что

где интеграл в правой части — это эллиптический интеграл, и благодаря этой формуле функция AG(a; b) Гаусса может быть положена в основу теории эллиптических функций. Разумеется, специальных кнопок для их вычисления даже на самых дорогих калькуляторах не предусмотрено. Однако, как мы видим, эллиптический интеграл можно быстро вычислить даже на простейшем калькуляторе. Интересно, что с помощью функции AGM можно быстро вычислить число p (американские математики с одинаковой фамилией Borwein посвятили этим вопросам специальную книгу под названием «π и AGM») и натуральные логарифмы, пользуясь при n 3 следующей приближенной формулой Р. Брента:

Выбрав n и вычислив заранее предыдущую формулу можно заменить более удобной для вычисления.

Разумеется, известно много других приближенных формул для вычисления ln x, в большинстве которых дается полиномиальное или рациональное приближение, например, формула

ln (1 + x) =0,9974442x – 0,4712839x2 + 0,2256685x3 – 0,0587527x4

при 0 x 1 имеет погрешность 7,510–5. Вычисление на калькуляторе лучше всего организовать по схеме Горнера, храня x в памяти и извлекая его оттуда для очередного умножения, но все коэффициенты придется вводить «вручную». Формула с удобными коэффициентами (начальный отрезок ряда Тейлора)

имеет гораздо более высокую погрешность, хотя в некоторых случаях и ее достаточно.

Для вычисления функции ex кажется на первый взгляд, что удобно использовать формулу

Вычисления сводятся к k-кратному возведению в квадрат. Однако эксперименты показывают (поучительно попробовать их повторить), что таким образом не удается получить даже 5 верных цифр ответа, более того, при выборе k = 30 точность будет меньше, чем при выборе k = 20.

Формула

дает более высокую точность и легко «программируется» методом Горнера, если x поместить в память и там хранить все время вычисления.

Но какие из приведенных формул наилучшие в смысле достижения заданной точности при минимальной затрате времени на нажатие кнопок — это очень непростая задача, которую можно использовать, например, в качестве темы для самостоятельных исследований (эта задача относится к области математики, которая называется теорией сложности вычислений).

Если нужно вычислить суперпозицию элементарных функций, например ln (1 + ex), то вначале надо вычислить внутреннюю функцию, записать результат в память, а потом вычислить внешнюю функцию, извлекая в случае необходимости запомненное значение из памяти. Кстати, приведенная для примера функция весьма полезна в вычислительной практике. Она, например, позволяет вычислить

ln (ex + ey) = max (x; y) + ln (1 + ex – y |)

и поэтому лежит в основе так называемых логарифмов Гаусса для суммы чисел.

Нужны ли в наше время логарифмы?

То, что логарифм произведения легко найти по логарифмам слагаемых, общеизвестно. Но как, работая с логарифмами, вычислять логарифм суммы чисел, а не произведения? Эта задача была актуальна в старое время, когда использование логарифмических таблиц было единственным средством ускорения вычислений. Очевидное ее решение таково: по таблицам антилогарифмов найти сами числа, потом их сложить и, заглянув еще раз в таблицы, найти логарифм суммы данных чисел. Основное время при этом уходит на поиск в таблицах. Гаусс предложил затабулировать функцию ln (1 + ex) и для вычисления ln (a + b) воспользоваться формулой

ln (a + b) = max (ln a; ln b) + ln (1 + e| ln a – ln b |),

которая позволяет найти логарифм суммы, всего лишь один раз заглянув в таблицы.

Использование логарифмов при вычислениях с калькулятором, в отличие от ручных вычислений, к ускорению не приводит, так как умножение на калькуляторе выполняется с той же скоростью, что и сложение, — это скорость нажатия кнопки человеком. Но в компьютерных вычислениях это уже не так — умножение (особенно чисел с плавающей запятой) раз в пять медленнее сложения. Но использовать идею Гаусса в компьютерных вычислениях непосредственно в указанном выше виде нельзя — функция ln (1 + ex) вычисляется медленно. Правда, ее можно затабулировать и перед началом работы программы загружать таблицу в оперативную память машины. Тогда время сложения, возможно, будет меньше времени умножения, и определенный выигрыш в скорости будет достигнут. Однако размер хранимой в памяти таблицы ограничен, и поэтому точность так реализованной операции сложения тоже будет ограничена. Поэтому для вычислений с действительными числами гауссовы логарифмы, как правило, не дают ускорения и на компьютерах. Но для вычислений определенного типа с целыми числами гауссовы логарифмы можно иногда эффективно применять. Речь идет о так называемых вычислениях по модулю данного простого числа p. Суммой и произведением двух чисел по модулю p называется остаток от деления на p соответственно обычной суммы и произведения. Указанные операции обладают всеми хорошими свойствами обычных операций сложения и умножения, в том числе они имеют обратные операции — вычитание и деление по модулю p (существование операции деления является следствием простоты числа p). Указанная арифметика по модулю p имеет важное значение в роли теории чисел, но на практике до недавнего времени она применялась редко. Положение изменилось в связи с бурным развитием так называемой публичной криптографии, в которой арифметические операции по простым модулям широко используются, причем сами эти модули весьма велики, и вычисления производятся универсальными или специализированными компьютерами. Операция умножения по модулю p выполняется существенно медленнее обычного умножения, так как включает в себя еще деление на p с остатком. Один из возможных способов ускорения таких модулярных вычислений — использование дискретных логарифмов. Теория таких логарифмов похожа на теорию обычных логарифмов, но ее обоснование существенно сложнее, так как требует знаний в области теории чисел. Кроме того, к сожалению, все известные алгоритмы для вычисления дискретных логарифмов весьма сложны и работают медленно. Поэтому и для компьютера в этой ситуации есть только один выход — заранее вычислять таблицу логарифмов (в старых книгах их называли индексами) и обратную к ней таблицу степеней и загружать их в память машины перед началом вычислений. Для сложения чисел при этом удобно использовать указанную выше формулу Гаусса, работая все время не с самими числами, а с их логарифмами. Модулярное умножение при этом заменяется на существенно более быстрое модулярное сложение (но уже по модулю p – 1), но модулярное сложение делается медленнее, оно требует двух сложений по модулю p – 1 и заглядывания в таблицу Гаусса (иногда логарифмы Гаусса называют также логарифмами Зеха, по имени автора популярных таблиц, или Якоби–Зеха, добавляя имя известного математика, заказавшего Зеху эти таблицы). К сожалению, и здесь возможности этого метода ограничены размером используемых таблиц (а он определяется размером оперативной памяти машины). Например, для девятизначных модулей этот метод уже практически не применим. Для небольших модулей, при условии предварительного составления таблицы Гаусса, указанный метод вполне эффективен при вычислениях на калькуляторе, так как модулярное сложение на калькуляторе выполняется гораздо удобнее, чем модулярное умножение.

Интересно, что в последнее время логарифмы Гаусса нашли применение в алгоритмах быстрого декодирования (в так называемых Турбо-кодах, которые позволяют исправлять неизбежно возникающие в большом количестве при передачи информации ошибки), используемых при передаче и приеме информации мобильными телефонами и радиомодемами. Только функция Гаусса вычисляется при этом не с помощью таблицы, а специальной микросхемой.

Как решать кубические уравнения на калькуляторе?

Рассмотрим вопрос о решении кубических уравнений с действительными коэффициентами на калькуляторе.

Начать естественно с преобразования уравнения x3 + ax2 + bx + c = 0 к виду x3 + px + q = 0. Делается это заменой тогда

Удобный алгоритм для вычисления p, q на калькуляторе таков (в записи они задаются названиями соответствующих кнопок и разделяются для удобства запятыми):

Число q оказывается на индикаторе, а p остается в памяти.

Использовать формулу Кардано–Тартальи для вычислений неудобно, так как придется неоднократно записывать промежуточные результаты.

Поэтому преобразуем уравнение x3 + px + q = 0 к виду 4x3 ± 3x + r = 0 заменой тогда

Рассмотрим три возможных случая.

Пусть 4x3 – 3x + r = 0, | r | 1. Это рассмотренный нами ранее неприводимый случай, и тогда корни находятся по формулам

где r = sin 3ф.

Тогда корни вычисляются следующим образом:

r ,F,sin,/,3,x→М,sin (получили x1),

p,∙,2,/,3,+,М→x,sin (получили x2),

p,∙,–2,/,3,+,М→x,sin (получили x3).

Рассмотрим случай 4x3 – 3x + r = 0, | r | > 1.

Воспользуемся функцией

называемой гиперболическим косинусом, и функцией

— гиперболическим синусом. Калькулятор вычисляет функцию sh ф, если нажать кнопку «hyp», а потом кнопку «sin». Для краткости будем обозначать эту комбинацию кнопок как «sinh», и аналогичное справедливо для гиперболического косинуса.

Заметим, что функция sh ф — нечетная и строго монотонно возрастающая, а функция ch ф — четная.

Поэтому функция sh ф имеет обратную функцию, которую калькулятор вычисляет, если нажать кнопки «F», потом «hyp», а потом кнопку «sin».

Можно считать, что функция ch ф тоже имеет обратную, и в качестве ее значения выбирается положительное значение ф, для которого ch ф = x.
В отличие от обратного гиперболического синуса, обратный косинус определен только при x 1.
Вычисляется он на калькуляторе аналогично обратному синусу.

Тогда если r = (sign r) ch 3ф, где sign r = 1 при r > 0 и sign r = –1 при r < 0, то корни уравнения находятся по формулам

Например, в случае r > 0 корни вычисляются следующим образом:

Рассмотрим последний случай: 4x3 + 3x + r = 0.
Тогда если r = –sh 3ф, то корни уравнения находятся по формулам

На калькуляторе они вычисляются следующим образом:

Читателю предоставляется возможность проверить и обосновать указанные выше алгоритмы, вывести формулы для p, q через a, b, c в преобразовании уравнения x3 + ax2 + bx + c = 0 к виду x3 + px + q = 0, доказать формулу выяснить, как использовать в решении неприводимого случая cos вместо sin.

Разумеется, корни уравнения будут найдены приближенно. Но если хотя бы один из этих корней рационален (а в школьных задачах это всегда так), то его можно точно определить, увидев период и предпериод выражающей его десятичной дроби. Найдя один рациональный корень точно, остальные корни можно явно выразить, решая соответствующее квадратное уравнение. Конечно, иногда рациональные корни легко найти известным алгоритмом путем небольшого перебора. Калькулятор здесь может помочь только в проверке, является ли данное число корнем. Для этого достаточно вычислить значение кубического многочлена в данной точке с помощью схемы Горнера.

Как выполнять вычисления с комплексными числами на калькуляторе?

Даже на многих хороших калькуляторах отсутствует прямая возможность вычислений с комплексными числами. Тем не менее покажем на примере отечественного калькулятора МК-71 несколько удобных способов работы с комплексными числами.

Начнем со сложения-вычитания нескольких чисел. Эта операция сводится к сложению-вычитанию двух чисел (a + bi) ± (c + id).

Действительные и мнимые части этих чисел придется вводить в калькулятор по отдельности. Для того, чтобы полученный результат можно было не переписывать на бумагу и заново вводить в калькулятор, нужно сохранить действительную часть результата a + b на индикаторе, а мнимую часть запомнить в памяти.

Ячейку памяти и ее содержимое обозначаем далее М, запись числа с индикатора в память обозначаем, как и на кнопке калькулятора, «x®М», вызов числа из памяти на индикатор обозначаем М®x, обмен содержимым между памятью и калькулятором выполняется кнопкой ««», но только после предварительного нажатия на специальную кнопку «F», ввод числа a на индикатор обозначаем просто a).

Сложение-вычитание (a + bi) ± (c + id) можно с выполнением указанного условия выполнить следующей последовательностью операций

a, ±, c, x→М, b, d, F, ↔.

Если после выполнения этой операции мы хотим к результату прибавить еще число e + fi, то, так как после обмена « на индикаторе опять возникла действительная часть результата, достаточно выполнить следующую последовательность операций:

+, e, F, ↔, +, f, F, ↔,

и далее ее повторять, пока выполняем сложения-вычитания.

Заметим, что в этом способе нам приходится каждое из заданных чисел вводить только один раз, а промежуточные результаты запоминает сам калькулятор.

Однако умножить два числа (a + bi)(c + id) без записи и повторного ввода промежуточных результатов так просто не удается. Можно, конечно, сделать это так:

a ,∙, c, –, b,∙, d, b,∙, c, +, a,∙,d,

пользуясь тем, что при вычислении выражений типа скалярных произведений acbd промежуточные результаты запоминать не нужно, но если мы запомним действительную часть результата acbd, то числа d, b, c, a придется вводить второй раз.

Интересно, что можно перемножить два комплексных числа, используя только три действительных умножения (кстати, как?), хотя калькуляторные вычисления этот трюк не ускоряют, потому что при этом увеличивается число используемых сложений-вычитаний.

Еще хуже дело обстоит с делением. Так как

то непосредственное использование этой формулы требует 11 арифметических операций.

Если вычислять по схеме

то достаточно 9 операций. Но и здесь числа a, b, r придется вводить по два раза.

Можно доказать, что меньшим числом операций обойтись нельзя.

Но если сомножители заданы в тригонометрической форме, то аналогично сложению-вычитанию можно вычислить любую комплексную дробь вида z = z1... zn, где  — умножение или деление без лишних операций ввода чисел.

Как же на калькуляторе преобразовать комплексное число в тригонометрическую форму? Это можно сделать с помощью кнопки «R→P», которая предназначена для перевода декартовых координат в полярные. После последовательности операций

на индикаторе появляется | z |, если потом нажать кнопки «F»,«↔», (или «x↔М»), то | z | окажется в памяти, но если после этого нажать кнопку ««» без предварительного нажатия кнопки «F», то на индикаторе появится полярный угол, а число в памяти не изменится. Можно и не запоминать предварительно | z |, а сразу нажать кнопку ««», тогда на индикаторе тоже появится полярный угол, но | z | безвозвратно пропадет.

Полярный угол совпадает с аргументом, если и равен arg z – 2π, если но так как по модулю 2π они совпадают, то полярный можно использовать при умножении-делении вместо аргумента с тем же успехом.

Для обратного перехода от полярных координат к декартовым нужно выполнить последовательность операций

|z|, F, R→P, ф, =,

после чего на индикаторе появится а если нажать кнопку ««», то на индикаторе появится Для того, чтобы не пропало число его предварительно нужно занести в память. Если одно из чисел | z |, f находится в памяти, его оттуда надо предварительно извлечь, нажав кнопку «М→x». Заметим, что если вместо полярного угла ввести любое равное ему по модулю 2π число, то результат не меняется.

Если числа в дроби вида z1... zn заданы не в полярных, а декартовых координатах, то неудобно их предварительно переводить в полярные координаты перед вычислением дроби. Можно вычислить по отдельности модуль и аргумент произведения, а потом преобразовать результат к стандартному виду.

Вначале можно вычислить (по модулю 2π) arg z с помощью последовательности операций

при этом вначале надо обнулить память. После каждой операции F, R↔P нажимаем кнопку ««», чтобы вызвать на индикатор arg zi, потом, если надо, меняем у него знак кнопкой «–» и прибавляем к числу в памяти кнопкой «П+».

Потом вычисляем | z | последовательностью операций

Для возведения в n-ю степень числа z есть более быстрый алгоритм. Для этого выполняем следующую последовательность операций:

при этом на индикаторе появится а в памяти окажется .


1 Англичане сделали это раньше, но им, как сотрудникам секретной криптографической службы, было запрещено публиковать свои результаты в открытой печати.

Гашков С.