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

В связи с недавней публикацией ув.basvic программ решения квадратных и кубических уравнений, открыл я школьную тетрадочку и обнаружил в ней две свои программы для МК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.FѺ 09.FѺ
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	R↓
B005	x<->y
B006	:
B007	LAST x
B008	R↑
B009	x<->y
B010	:
B011	2
B012	:
B013	+/-
B014	x2
B015	LAST x
B016	R↓
B017	x<->y
B018	-
B019	x<->y
B020	R↓
B021	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 байта на команду" могло быть простым и надежным решением.

Comments

В своё время я под Б3-34 тоже писал решалку квадратных уравнений аналогичную первой, приведенной Вами. Разница в том, что я использовал регистры A,B,C,D а не 0,1,2,3...

Конечно, сократить для HP-35s можно.

А что у Вас за команда во второй программке по адресу 16?

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

Команда по адресу 16.27 - это 16.К-, чтобы ошибку сгенерировать. Я скопировал из эмулятора (он выводит код почему-то) и не исправил.

Следует заметить, что на CASIO fx-9750G (в 7400G такого решателя нет, но и 5800Р и 991ES решатель есть), TI-89T, HP-50G есть решатель этих уравнений из коробки, поэтому для многих современных ПМК эта задача не актуальна.
на TI-89 например:
cSolve(x^2-4*x+13=0,x)
cSolve(x^3-8*x^2+25*x-26=0,x)

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

Проверил я обе Ваши программы на железном МК-52 и на двух уравнениях:
x2-4x+3=0 (1, 3)
x2-4x+13=0 (2+3i, 2-3i)
В обоих случаях вещественные корни берёт правильно, а комплексные - нет

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

Ответ сошелся, я прогнал второе уравнение (только первую программу с регистрами):
13 B↑ 4 /-/ B↑ 1 B↑ В/0 С/П
получаем ЕГГОГ, нажимем <->, "3", еще раз <->, получаем "2"
Ответ: 2 ± i3

Другой пример 2x2 + 4x + 7 = 0 тоже выдает правильный ответ
-1 ± i1,5811388

В аналитическом виде: -1 ± i√10/2

Попробую на другом экземпляре калькулятора. Может у первого с микропрограммами не всё в порядке.
Попробовал. Сошлось.

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

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

P.S. Вероятно, на HP-15C можно сделать более короткий вариант. Проверять эту идею мне уже некогда (аврал).

<Этот комментарий тоже можно удалить>

Ну, зачем же удалять. Лет через несколько приятно будет почитать и вспомнить :)

Запись идет под тегом "Конкурс", так что всех авторов надо указывать.

Ну если конкурс, то я от себя предложу чуть более короткий вариант:

B001	LBL B
B002	INPUT A
B003	INPUT B
B004	INPUT C

B005	RCL B           // расчёт -b/(2a)->e
B006	RCL A
B007	/
B008	2
B009	/
B010	+/-
B011	STO E

B012	x2             // расчёт D/4
B013	RCL C
B014	RCL A
B015	/
B016	–

B017	x<0?
B018	GTO B021
B019	SQRT x        // извлечение вещественного корня из D/4
B020	GTO B025
B021	+/-           // извлечение мнимого корня из D/4
B022	SQRT x
B023	i
B024	*

B025	STO D         // вычисление 1-го корня уравнения
B026	RCL E
B027	+
B028	RCL E         // вычисление 2-го корня уравнения
B029	RCL D
B030	–
B031	RTN

Длина 95 байт, правда вывод результатов на мой взгляд более удобный. Всегда в регистре X стека один корень а в регистре Y стека второй корень уравнения.

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

Ещё одна более короткая версия программки:

H001 LBL H
H002 CF 10
H003 -REGY/2/REGZ->A
H004 (A^2i0-REGY/REGT)^0.5->B
H005 A-B
H006 A+B
H007 RTN

(LN=64)

ВАХ !!! :-0

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

Можно ещё немного подсократить:

H001 LBL H
H002 CF 10
H003 -REGY/2/REGZ->A
H004 (A^2i0-REGY/REGT)^0.5->B
H005 -
H006 A+B
H007 RTN

(LN=61)

Теперь напрашивается вывод, что если RPN появилась в ПМК с целью уменьшить требования к памяти калькулятора (отсутствие скобок сокращает число команд), то в наше время она этого не обеспечивает, по меньшей мере в ПМК ХП. Оно понятно, что для алгебраической записи нужен парсер, а польская позволяет обойтись без него, что в прошлом существенно удешевляло разработку ПЗУ для ОС ПМК, но в наше время это не так чтобы актуально. Не так ли?

Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G

Не только в ПМК, обратная польская запись упрощает создание анализаторов грамматик, сводя основную работу к лексическому разбору. Яркий пример - язык Лисп, реализованный еще в начале 1960-х годов (недавно я как раз написал рецензию на одну старую книгу по этой теме).

[quote=basvic]Теперь напрашивается вывод, что если RPN появилась в ПМК с целью уменьшить требования к памяти калькулятора (отсутствие скобок сокращает число команд), то ... [/quote]

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

J001 LBL J
J002 ENTER
J003 R↑
J004 x<>y
J005 /
J006 R↓
J007 /
J008 2
J009 /
J010 +/-
J011 STO A
J012 ENTER
J013 x^2
J014 R↑
J015 –
J016 0.5i0
J017 y^x
J018 STO B
J019 –
J020 RCL A
J021 RCL B
J022 +
J023 RTN

(LN=75)

Вероятно, её можно немного подсократить.

Язык RPL имеет в своём арсенале больше команд манипуляции стеком, чем обычный RPN. Аналогичная программа для HP 50g выглядит так:

<<
  PICK3
  /
  UNROT
  SWAP
  2 
  *
  /
  NEG 
  DUP
  SQ
  ROT
  -
  SQRT
  DUP2
  -
  EVAL
  UNROT
  +
  EVAL
>>

(размер 58 байт).

[quote=basvic]... в наше время она этого не обеспечивает, по меньшей мере в ПМК ХП. ... [/quote]

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

P.S. Уравнения в HP-35s - это в большей степени способ более наглядного представления кода, а не уменьшения размера программы (в байтах, не по количеству строк).