2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение06.06.2018, 14:21 
Аватара пользователя


11/06/12
8856
calm.angel.driven
UMV, позвольте полюбопытствовать: какая мотивация движет человеком, в 2018 году интересующимся подобными задачами?

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение06.06.2018, 15:00 


05/09/16
6462
UMV в сообщении #1317488 писал(а):
К сожалению ресурсов программных, и памяти не хватает вот я и предположил, что можно попробовать "математизировать" задачу - избавиться от таблиц данных заменив их алгебраическим выражением.

В вашем случае табличное задание будет намного компактнее "алгебраического".
Значит, надо подумать, как оптимизировать табличный способ. У вас память на 15 регистров. Но это не значит, что вы можете запомнить только 15 чисел. Количество букв везде меньше 16, а значит для хранения нужно 4 бита, в одном регистре можно хранить минимум два числа (если использовать битовые операции калькулятора). Но можно хранить и десятичные. Каждый регистр может хранить 8 десятичных разрядов (как минимум), это 4 раза по 2 разряда, то есть в одном регистре можно хранить минимум 4 числа каждое от 0 до 99. Вам, наверное надо хранить не 4 а 5 чисел в каждом регистре. Ну что ж, есть еще три знака мантиссы, итого 8+3=11 знаков, а на пять чисел надо 10 знаков. Можно уместить! :D

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение06.06.2018, 15:05 


04/06/18
15
Никаких секретов нет, на форуме клуба любителей калькуляторов есть данная задача для мк61 - 1-9999 пока никто не решил.
http://www.leningrad.su/calc/cforum.php ... picid=2444

Мотивация простая - суметь решить задачу. Разве у вас математиков это не основная мотивация?

-- 06.06.2018, 16:12 --

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

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение06.06.2018, 15:48 


05/09/16
6462
Идея такая. Записываем в регистры следующее:
Регистр 1: 1003001104
Регистр 2: 0906081003
Регистр 3: 0906081003
Регистр 4: 1209051206
Регистр 5: 0907091004
Регистр 6: 1008091105
Регистр 7: 0907091004
Регистр 8: 1109111206
Регистр 9: 1109091206

Посчитаем число букв в словесном обозначении числа 3586.
Число тысяч равно 3. Число буков в "три тысячи" смотрим в двух разрядах 10-11 числа в регистре 3 (0906081003), оно равно 9. Число буков в "пятьсот" смотрим в разрядах 8-9 числа в регистре 5 (0907091004), оно равно 7. Число букв в "восемьдесят" смотрим в разрядах 6-7 регистра 8 (1109111206), оно равно 11. И наконец, число букв в "шесть" смотрим разрядах 1-2 регистра 6 (1008091105), оно равно 5. Итого 9+7+11+5=32. Ну и дальше проверяем делимость 3586 на 32.

Чтобы не заморачиваться с мантиссой и уложить все в 8 разрядов, замечаем что слова "один", два", три" ... а также "двести", "триста" ... "девятьсот" все короче 10 букв, так что укладываются в 1 разряд, так что можно уложиться в 8 разрядов, вот так:

Регистр 1: 10300114
Регистр 2: 09608103
Регистр 3: 09608103
Регистр 4: 12905126
Регистр 5: 09709104
Регистр 6: 10809115
Регистр 7: 09709104
Регистр 8: 11911126
Регистр 9: 11909126

На примере регистра 3: 09608103
Разряды 7-8: "09" - количество букв в "три тысячи"
Разряд 6: "6" - количество букв в "триста"
Разряды 4-5: "08" - количество букв в "тридцать"
Разряды 2-3: "10" - количество букв в "тринадцать"
Разряд 1: "3" - количество букв в "три"

Тут еще замечаем, что регистры 2 и 3, а также 5 и 7 совпадают, это может еще сократить использование памяти, но нам вроде это уже и не нужно.

Можно ли все это уложить в 105 шагов... Ну, наверное будет непросто :mrgreen:

-- 06.06.2018, 15:50 --

UMV в сообщении #1317596 писал(а):
Вариант с запаковкой таблиц в регистры уже был предложен, но для него тоже не хватает шагов программы...

Так по условиям что, предустановка регистров это разве не подготовка к запуску программы?

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение06.06.2018, 16:30 
Заслуженный участник
Аватара пользователя


27/04/09
25190
Уфа
В книжке с программами для калькуляторов, которую я листал, установка регистров описывалась отдельно. Программно, тем более, загрузить можно не все возможные значения.

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение06.06.2018, 17:59 
Аватара пользователя


11/06/12
8856
calm.angel.driven
UMV в сообщении #1317596 писал(а):
Мотивация простая - суметь решить задачу.
Спасибо. Мне было интересно происхождение задачи, спортивное или производственное (не, ну а вдруг второе ;-).

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 00:01 


04/06/18
15
wrest в сообщении #1317608 писал(а):
Идея такая. Записываем в регистры следующее:
Регистр 1: 1003001104
Регистр 2: 0906081003
Регистр 3: 0906081003
Регистр 4: 1209051206
Регистр 5: 0907091004
Регистр 6: 1008091105
Регистр 7: 0907091004
Регистр 8: 1109111206
Регистр 9: 1109091206

Посчитаем число букв в словесном обозначении числа 3586.
Число тысяч равно 3. Число буков в "три тысячи" смотрим в двух разрядах 10-11 числа в регистре 3 (0906081003), оно равно 9. Число буков в "пятьсот" смотрим в разрядах 8-9 числа в регистре 5 (0907091004), оно равно 7. Число букв в "восемьдесят" смотрим в разрядах 6-7 регистра 8 (1109111206), оно равно 11. И наконец, число букв в "шесть" смотрим разрядах 1-2 регистра 6 (1008091105), оно равно 5. Итого 9+7+11+5=32. Ну и дальше проверяем делимость 3586 на 32.

Чтобы не заморачиваться с мантиссой и уложить все в 8 разрядов, замечаем что слова "один", два", три" ... а также "двести", "триста" ... "девятьсот" все короче 10 букв, так что укладываются в 1 разряд, так что можно уложиться в 8 разрядов, вот так:

Регистр 1: 10300114
Регистр 2: 09608103
Регистр 3: 09608103
Регистр 4: 12905126
Регистр 5: 09709104
Регистр 6: 10809115
Регистр 7: 09709104
Регистр 8: 11911126
Регистр 9: 11909126

На примере регистра 3: 09608103
Разряды 7-8: "09" - количество букв в "три тысячи"
Разряд 6: "6" - количество букв в "триста"
Разряды 4-5: "08" - количество букв в "тридцать"
Разряды 2-3: "10" - количество букв в "тринадцать"
Разряд 1: "3" - количество букв в "три"

Тут еще замечаем, что регистры 2 и 3, а также 5 и 7 совпадают, это может еще сократить использование памяти, но нам вроде это уже и не нужно.

Можно ли все это уложить в 105 шагов... Ну, наверное будет непросто :mrgreen:

-- 06.06.2018, 15:50 --

UMV в сообщении #1317596 писал(а):
Вариант с запаковкой таблиц в регистры уже был предложен, но для него тоже не хватает шагов программы...

Так по условиям что, предустановка регистров это разве не подготовка к запуску программы?


Спасибо. В некоторой вариации ваша идея уже рассматривалась, но реализация весьма затруднительна (скорее всего не возможна) учитывая набор операций программирования, длину программы, а также количество регистров 15. 15-9=6 Шесть регистров - не хватит для организации программы (циклы, косвенные обращения, сохранения результата и т.д.). Да в регистры перед запуском программы заносить данные можно это общепринятая практика.

Все таки элегантно было прогонять данные через математическое выражение. Например число 3581 из него выделяем 1 загоняем в выражение на выходе число 4 и т.д. Для каждого разряда своё выражение. Потом просуммировать и т.д.

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 01:11 


05/09/16
6462
UMV в сообщении #1317722 писал(а):
Все таки элегантно было прогонять данные через математическое выражение. Например число 3581 из него выделяем 1 загоняем в выражение на выходе число 4 и т.д.

Так ведь "математическое выражение" тоже отнимет память.
UMV в сообщении #1317722 писал(а):
15-9=6 Шесть регистров - не хватит для организации программы (циклы, косвенные обращения, сохранения результата и т.д.).

Можно на два уменьшить: 2 и 3 совпадают, а также 5 и 7. Но ценой шагов, конечно.

Ну я не знаю, есть еще $e$ и $\pi$, синусы и косинусы и может как-то хитро и можно составить, чтобы запись была короче табличной... Но "прямых" идей пока нет.

-- 07.06.2018, 01:13 --

UMV в сообщении #1317722 писал(а):
Для каждого разряда своё выражение. Потом просуммировать и т.д.

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

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 08:29 
Модератор


20/03/14
9679
 !  UMV
Замечание за избыточное цитирование. post1317722.html#p1317722

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 11:45 


04/06/18
15
Вот именно выражение с косинусами и логарифмами - что-то хитрое. Если что придумаю напишу, пока мыслей нет. К стати вариант 1-999 на мк61 получилось реализовать, но тоже сложно и есть нюансы.

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 12:24 


05/09/16
6462
UMV
Интересная задачка :)

Вот еще пара соображений.
Допустим, длинe слов "один", "два" и т.п. мы как-то сохранили, и получили $d_1=4;d_2=3;d_3=3$ и так далее, то есть $d_i$ - длина слова обозначающая $i$-ю цифру.
Тогда длина слова, обозначающего число $10 +  d_i$ (то есть "одиннадцать", "двенадцать" и т.п.) длиннее на 7 или 6 букв, на 6 - для тех названия цифр которых оканчиваются на мягкий знак (пятнадцать - девятнадцать).
Математически это можно записать так $e_i=d_i+7-\left[\dfrac{i+1,1}{10}\right]$ где квадратные скобки означают округление до целого.
Сотни, как видим, мягкий знак включают, так что все кроме первой длинее на 3 (сто, двести,четыреста,пятьсот).
Чрез округление сотни записываем так: $g_i=d_i-1+4\cdot \left[\dfrac{i+3,1}{10}\right]$
Так же, замечаем, что длину обозначения тысяч ("одна тысяча", "две тысячи") также можно выразить через округление: $h_i=d_i+6-\left[\dfrac{i+0,1}{10}\right]$

Пусть само исходное число записано в виде $ABCD$, то есть равно $1000\cdot A + 100 \cdot B + 10 \cdot C + D$
Тогда если $C=1$, а остальные $A,B,D$ не равны нулю, то количество букв в записи числа будет равно
$L=d_D + d_B + d_A + 12 -\left[\dfrac{D+0,1}{10}\right]+4 \cdot \left[\dfrac{B+3,1}{10}\right]-\left[\dfrac{A+1,1}{10}\right]$

Я не помню, округление до целого в этом калькуляторе как-то просто делается или сложно?

А, или там кажись есть "целая часть", тогда формула будет
$L=d_D + d_B + d_A + 12 -\left\lfloor\dfrac{D+6,1}{10}\right\rfloor+4 \cdot \left\lfloor\dfrac{B+8,1}{10}\right\rfloor-\left\lfloor\dfrac{A+5,1}{10}\right\rfloor$

Самая "засадная" последовательность это десятки, из-за того что 40 это "сорок" а не "четыредесят". Как вы этот вопрос решили?

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 13:42 


04/06/18
15
Так так так... В этом что то есть! Операция выделения целого на калькуляторе есть. Надо подумать и все обмозговать.
В варианте 1-999 была таблица единицы, десятки, сотни.
Программа
Программа для 1-999
00.1 01.2 02.1 03.1 04.4 05.2 06.3 07.2 08.4 09.4 10.1 11.4 12.6 13.6 14.3 15.7 16.8 17.7 18.9 19.7 20.1 21.1 22.4 23.4 24.7 25.5 26.6 27.5 28.7 29.7 30.ИП9 31.\ 32.К[x] 33.Fx=0 34.30 35.FBx 36.ИП9 37.* 38.2 39.+ 40.КБПb 41.ИПe 42.+ 43.Пe 44.В/О 45.1 46.П6 47.3 48.П1 49.ИП0 50.П8 51.ИП8 52.ИП9 53.\ 54.В| 55.К{x} 56.ИП9 57.* 58.КП6 59.<-> 60.К[x] 61.П8 62.<-> 63.Fx<>0 64.74 65.ИП5 66.ИП1 67.ИП9 68.* 69.- 70.+ 71.Пa 72.КБПa 73.КППc 74.FL1 75.51 76.ИП3 77.1 78.- 79.К x=0 7 80.ИП2 81.Кx<>0 7 82.4 83.- 84. Кx<0 7 85.1 86.КППc 87.ИП0 88.ИПe 89.\ 90.К{x} 91.Fx=0 92.97 93.ИПd 94.1 95.+ 96.Пd 97.Cx 98.Пe 99.FL0 100.45 101.ИПd 102.С/П
Шаги 00-29 таблица перевода строк символов в цифры – единицы, десятки, сотни – 2, ячейки 00 10 20 произвольная цифра 1. Шаги 30-40 выделение из числа первую цифру и возврат в глобальный цикл. Шаги 41-44 подпрограмма подсчета букв в текущей цифре. Шаги 45-75 выделение чисел в исходном числе формирование адреса для перехода в таблицу данных, переход, после возвращения из таблицы суммирование чисел букв. Шаги 76-86 Проверка и корректировка для (одиннадцать, двенадцать, и т.д.). Шаги 87-98 Подсчет чисел делящихся нацело. Шаги 99-100 организация глобального цикла. Шаги 101-102 Вывод результата.
На андроид эмуляторе в ускоренном режиме программа считала 2 часа результат 65
Использование – перед запуском записать в регистры Пc=41 Пb=73 П9=10 П5=30 П0=999 Пe=0 Пd=0 П7=87
Запуск программы БП 45 С/П

Суть работы программы следующая имеем число например 358 (эти числа от 999 до 1 уменьшаются в глобальном цикле в регистре 0, например выделяем 8 (В калькуляторе это поделили на 10 отбросили целую часть умножить на десять) затем высчитываем адрес и прыгаем в таблицу данных по адресу 08 там 4 (почему не шесть - нужны однозначные цифры, а шестьдесят - 10 поэтому все цифры в таблице уменьшены на 2, а на выходе из таблицы автоматом прибавляем два шаги программы 38-39) прыгнув по адресу 08 мы получаем число 4 и затем идем по таблице шаг за шагом получая в рабочем регистре цифру сначала 44 потом 441 затем 4414 44146 441466 и так далее до восьми разрядов после ввода 8 разряда все остальные введенные цифры не вводятся (способность калькулятора) на выходе мы можем получить максимально длинное число 8 разрядов нужное число только первый левый разряд - его выделяем шаги 30-37 и автоматом прибавляем 2
Допустим выделили 5 в десятках (к стати выделение чисел разрядов - 45 - 61 шаги, там с организацией циклов) формируем адрес перехода в таблицу ( по формуле поймете как это сделано 30 - 2 * 10 +5 30 и 10 коэффициенты 2 номер разряда меняется в цикле для каждого разряда в обратную сторону - для единиц 3 для сотен 1) итак получим адрес 15 прыгаем туда А на выходе 7+2= 9, так в цикле прогоняем единицы, десятки, сотни. Остались не стандарты (11, 12, 13....) шаги 76-86 корректировка если число второго разряда и 1 и первого не ноль тогда корректировка
всю таблицу писать не буду, но поймете как сделано предположим у нас 11 - 11 символов, но мы уже посчитали по десяткам 1 это 6 символов и по единицам 1 это четыре символа, т.е. что бы откорректировать нужно прибавить 1 это только для 11, 12, 13 для всех остальных чисел ничего корректировать не надо пример 14 -это 12 символов, но по десяткам мы уже прибавили 6 и по единицам 6 вот у нас уже есть 12.

Извините написал сумбурно и возможно не понятно.
PS. Хочу отметить, что таблица данных в программе и переход в неё по адресу это стандартный ассемблерный прием программирования - просто в программируемых калькуляторах это пожалуй редкость.

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 14:50 


04/06/18
15
А вообще вашу идею wrest над подробно изучить - прогонять одну таблицу единиц через десятки, сотни, тысячи это рассматривалось, но корректировки предлагались через условия - не хватает памяти, у вас условий корректировок нет, но вопрос в выражениях - уменьшит это длину программы или нет. На выходных буду разбираться.

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 15:04 


05/09/16
6462
UMV в сообщении #1317883 писал(а):
прогонять одну таблицу единиц через десятки, сотни, тысячи это рассматривалось, но корректировки предлагались через условия - не хватает памяти,

Засада пока остается с 40 - "сорок" (длина 5) вместо "четыредесят" (длина 11) и 90 - "девяносто" (длина 9) вместо "девятьдесят" (длина 11), там или таблица или условия, пока что формула не вырисовывается.

Ну или вырисовывается такая. Пусть у нас десятки будут буквой $f$ обозначаться. Нам надо получить
$f_1=any$ (чисел "десять два" не бывает)
$f_{2,3,5,6,7,8,}=5;f_4=-1;f_9=3$ То есть формула должна "срабатывать" на 4-ку и 9-ку.
4 и 9 - полные квадраты (а единица у нас не должна появляться тут), так что квадратные корни из них - целые числа :mrgreen: так что попробуем как-то использовать это.

 Профиль  
                  
 
 Re: Алгебраическое представление последовательности по значениям
Сообщение07.06.2018, 15:43 


27/08/16
5463
UMV,
вам всего нужно упаковать пять таблиц по 10 чисел. Каждую таблицу храните в двух регистрах памяти, представив значения цифрами чисел в системе счисления по модулю, например, 50. В регистр памяти влезет пять таких чисел. Останутся свободными пять регистров памяти и стек для переменных программы. Думаю, в 105 команд можно уложиться. Используйте подпрограммы. Можно упаковать и 10 чисел в один регистр, если кодировать только до 6 букв на слово, или минимальное количество букв предварительно вычесть из значений в таблице и прибавлять позже. Это может позволить выиграть регистры памяти за счёт удлинения программы.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Toucan, maxal, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group