КВУР - квадратное уранение (34, 61, HP35s). Сколько места занимает программа?

| рубрика «Программы» | автор st
Метки: ,

В связи с недавней публикацией программ решения квадратных и кубических уравнений, открыл я школьную тетрадочку и обнаружил в ней две свои программы для МК61/52 (должны пойти и на более ранних моделях). Программы оказались короткими.

Уравнение вида: ax2 + bx + c = 0

КВУР МК-61/52 (с использованием регистров)

00.П0  01.:    02.2   03.:   04./-/ 05.П1  06.Fx^2 07.<-> 08.ИП0 09.:
10.-   11.Fx<0 12.18  13./-/ 14.F  15.ИП1 16.ВП   17.,   18.F  19.ИП1
20.<-> 21.-    22.ИП1 23.FВx 24.+   25.С/П

Вводим c B↑ b B↑ a В/0 С/П

После останова на индикаторе x1, нажимаем <-> - x2. Если корни комплексные вида a±ib, то вместо останова ЕГГОГ, нажимаем <-> - на индикаторе b, еще раз нажимаем <-> - на индикторе a.

КВУР МК-61/52 (без использования регистров)

00.<-> 01.FВx 02.:    03.2  04.:   05./-/ 06.В^ 07.Fx^2 08. 09.
10.:   11.-   12.Fx<0 13.17 14./-/ 15.F  16.К- 17.F   18.-   19.В^
20.FВx 21.2   22.x    23.+  24.С/П

Инструкция та же самая.

Предположительно, программа с аналогичным функционалом и сервисом должна занимать на HP35s не больше места. А листинг на UserRPL или TI/CASIO-бейсике не должен превышать 25 строк (1 оператор на строку).

Предлагаю проверить предположение.

Дополнение от 01.11.2014. Программа для HP 35s без использования регистров.

A001    LBL A
A002    RPN
A003    CF 10               // ввод FLAGS 2 .0
A004    REGY÷-2÷REGZ        // ввод EQN R↓Y : +/- 2 : R↓Z
A005    SQ(REGX)-REGY÷REGT  // ввод EQN x2 R↓X курсор вправо - R↓Y : R↓T
A006    x≥0
A007    GTO A010
A008    REGY+ixSQRT(-REGX)
A009    RTN
A010    REGY+SQRT(REGX)
A011    REGZ–SQRT(REGY)
A012    RTN

Ввод: a ENTER b ENTER c XEQ A ENTER

Если корни действительные, то они выводятся на первой и второй строках индикатора. Если корни комплексные вида a ± ib, то в первой строчке выводится ai*b.

Длина программы для HP 35s - 114 байт. Это больше, чем размер программы для МК61 за счет использования выражений, хотя построчная запись короче.

Прямой покомандный перевод программы невозможен, так как, например, функция LASTx соответствует FBx не полностью: при стековых операциях перемещений из RX туда ничего не записывается. Требуется добавить несколько команд.

Сравним размер программ на HP35s

Дополнение от 02.11.2014.

Программа для HP 35s с использованием мнемоники комплексных чисел (предложена Vlad_AB, с небольшими изменениями).

С001    LBL С
С002    RPN
С003    CF 10
С004    (-REGY-(SQ(REGY)-4i0xREGZxREGX)^0.5)÷2÷REGZ
С005    (-REGZ+(SQ(REGZ)-4i0xREGTxREGY)^0.5)÷2÷REGT
С006    RTN

Длина 104 байта.

Ввод: a ENTER b ENTER c XEQ C ENTER

Вывод: корни в двух строках дисплея вида a ± ib. Если Корни действительные, то b = 0.

Несмотря на компактную запись, программа занимает 104 байта. Возможно, виной этому алгебраические выражения? В этом случае программа без использования таковых должна занимать меньше места.

Вариант программы для HP 35s без использования регистров и выражений выглядит менее компактным, но каждому шагу соответствует одна команда.

B001    LBL B
B002    RPN
B003    x<->y
B004    RB005    x<->y
B006    :
B007    LAST x
B008    RB009    x<->y
B010    :
B011    2
B012    :
B013    +/-
B014    x2
B015    LAST x
B016    RB017    x<->y
B018    -
B019    x<->y
B020    RB021    x>=0?
B022    GTO B025
B023    +/-
B024    x
B025    RTN
B026    x
B027    -
B028    ENTER
B029    ENTER
B030    LAST x
B031    2
B032    x
B033    +
B034    RTN

Ввод: a ENTER b ENTER c XEQ B ENTER

Если корни действительные, то они выводятся на первой и второй строках индикатора. Если корни комплексные вида a ± ib, то в первой строчке выводится a, во второй мнимая часть b.

При этом длина программы по прежнему составляет 104 байта!

Полностью очищаем калькулятор (CLEAR, ALL) и вводим простейшую программу.

A001    LBL A
A002    RPN
A003    RET

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

Ну что же, внутреннее представление команд языка HP 35s использует один и более байтов для записи каждой из них. Для условных и безусловных переходов это понятно, нужны 3 байта минимум, а вот для простых команд вроде x2?

Добавим эту команду в программу:

A001 LBL A
A002 RPN
A003 x2
A004 RET

Информация о состоянии показывает длину программы уже в 12 байт. Команда возведения в квадрат занимает 3 байта!

По сравнению с аскетичной записью команд МК61 подобный подход может выглядеть как расточительство памяти. Однако вспомним, что общее число операций в МКхх ограничивалось 255 командами и адресацией 15 регистров памяти, тогда как HP 35s позволяет использовать 800 регистров, 40 физических констант и сотни функций. Для кодирования такого набора требуется не менее 2 байт на каждую команду.

С другой стороны, HP 35s является модернизированной версией старой модели HР 35, требования к объёму занимаемой программой памяти не являются приоритетными, поэтому даже единообразное кодирование "по 3 байта на команду" могло быть простым и надежным решением.