LINUX.ORG.RU

Помогите развить новую концепцию ЯП


1

2

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

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

Единственный минус - возможно большой размер программ. Но если так подобрать базис разложения, то всё будет мало весить - ведь записать надо будет не сами данные, а лишь «координаты» в этом базисе. Понял это ещё с уроков геометрии - там делается то же самое, но с векторами

Ответ на: комментарий от pi11

Эх, жаль что это уже реализовали. Но надо посмотреть - вдруг можно что-то улучшить

esandmann
() автор топика

Но если так подобрать базис разложения, то всё будет мало весить - ведь записать надо будет не сами данные, а лишь «координаты» в этом базисе. Понял это ещё с уроков геометрии - там делается то же самое, но с векторами

Теперь осталось понять уроки информатики — информации не становится меньше просто так.

Плюс,

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

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

ilammy ★★★
()
Ответ на: комментарий от ilammy

Не-не. Разложение - дело компилятора, долгое дело. А вот восстанавливать будет проще. Тут асимметричный по времени процесс

esandmann
() автор топика
Ответ на: комментарий от ilammy

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

Может разработать какую-нибудь концепцию приближенных вычислений, где каждый последующий коэффициент разложения влияет на результат всё меньше и меньше? Это пригодилось бы во многих задачах, например декодировании видео/аудио.

А может сделать так, что для коэффициентов с большим индексом считать надо меньше.

Интересно, какие классы задач можно сюда отнести?

esandmann
() автор топика
Ответ на: комментарий от esandmann

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

anonymous
()

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

Это на практике хорошо описывает и моделирует паттерн-матчинг в основном. Посмотри эрланг для вдохновения и его ключевые возможности. Несколько диаметрально, но достойно внимания: forth.

Нужен не только язык но и система концептуальных подходов и парадигм, порою парадоксальных. Например смешение ООП и ФП.

Смотри в первую очередь, то что позволяет осуществить матчинг, горячую замену кода, другие модные фичи... Идеал невозможен, но к нему можно стремиться.

swwwfactory ★★
()
Ответ на: комментарий от buddhist

Там речь о некотором подмножестве входных данных. А мне надо найти такие задачи, которые возможно решить таким образом на всём множестве входных данных (но, может быть, с немного неточным результатом)

esandmann
() автор топика

возможно большой размер программ

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

nanoolinux ★★★★
()
Ответ на: комментарий от esandmann

но, может быть, с немного неточным результатом

Типа lossy audio compression

esandmann
() автор топика
Ответ на: комментарий от nanoolinux

Вы не поняли моего метода!

У квадратного уравнения x**2 +px + q = 0, p и q - уже эти малые коэффициенты, которые можно сохранить в программе и восстановить по ним данные! Мой метод годится только для сложных программ, а не таких простых как эта

У нас есть отображение входные данные -> выходные. Это не обязательно таблица, может быть простая формула

esandmann
() автор топика
Ответ на: комментарий от esandmann

Упрощённо: есть набор из n кубитов, каждый из которых находится в суперпозиции двух состояний, итого вся система одновременно находится в 2^n состояниях. Суть квантового алгоритма в том, чтобы из набора входных данных получить результат с помощью неких операций над этими кубитами. А эти операции затрагивают одновременно все значения кубита, а не только одно определённое.

E ★★★
()
Ответ на: комментарий от E

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

esandmann
() автор топика
Ответ на: комментарий от esandmann

Ти, я бачу, нифига в цифровых схемах не понимаешь. Читай про управляемый/неуправляемый преобразователь сигнала. Сначала про аналоговые почитай, потом про цифровые. А потом пойми, что даже текстовый редактор - это в конечном счёте ф-ия, принимающая нажатия кнопок и выдающая чего-то там на мониторе.

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

Т.е. поздравляю - твоя „новая концепция ЯП“ уже придумана лет 100 как.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от esandmann

малые коэффициенты, которые можно сохранить в программе и восстановить по ним данные!

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

swwwfactory ★★
()
Последнее исправление: swwwfactory (всего исправлений: 2)
Ответ на: комментарий от esandmann

чем считала бы при традиционном подходе

„традиционный подход“ - это Кнут я так понимаю?

nanoolinux ★★★★
()
Ответ на: комментарий от esandmann

вот мне тут как-то давно-давно приятель предлагал паковать данные путем записи смещения-длины числа Пи. то есть находится блок в числе Пи, который подходит для данного блока данных, пишется его смещение и длина. и так далее. В результате можно сжать очень качественно, учитывая то, что Пи - теоретически бесконечен :]. А Пи даже локально хранить необязательно, можно просто сервис сделать, который по смещению/длине будет отдавать кусок. Вот мне кажется ты что-то из разряда такого же предлагаешь.

anonymous
()
Ответ на: комментарий от nanoolinux

Вы опять не понимаете. Программы считают что-то, почти не опираясь на заранее расчитанные данные. А я предлагаю так:

{Вхдн.дн., Бзс} -Вычсл-> {Выхдн.дн.}

а сейчас все (почти) программы работают так:

{Вхдн.дн} -Вычсл-> {Выхдн.дн}

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

esandmann
() автор топика
Ответ на: комментарий от esandmann

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

nanoolinux ★★★★
()

предопределить все наборы входных данных и, скажем, разложить их

приведи простой пример, пожалуйста. скажем, для программы, возводящей входное число в квадрат

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

В результате можно сжать очень качественно,

Занятно. А как насчет вероятности нахождения нужного блока и сложности вычисления нужного порядка точности?

swwwfactory ★★
()
Ответ на: комментарий от swwwfactory

собссно это не единственная проблема, да :) Но вообще, если число бесконечно и непериодично, что вероятность встретить там нужный блок практически равна единице. Но есть один нюанс (с) ...

anonymous
()
Ответ на: комментарий от anonymous

собссно это не единственная проблема, да :) Но вообще, если число бесконечно и непериодично, что вероятность встретить там нужный блок практически равна единице. Но есть один нюанс (с) ...

есть т.н. цепные дроби - с помощью них можно описать любую цепочку как некую константу. Тоже можно использовать как алгоритм сжатия.

По идее, если есть логарифмирование, то и есть еще более простые операции или техники, сводящие к простоте...

swwwfactory ★★
()
Последнее исправление: swwwfactory (всего исправлений: 1)
Ответ на: комментарий от swwwfactory

есть т.н. цепные дроби - с помощью них можно описать любую цепочку как некую константу. Тоже можно использовать как алгоритм сжатия.

Напоминает алгоритм «сжатия» Бабушкина. Что-то он действительно жал

esandmann
() автор топика
Ответ на: комментарий от esandmann

Напоминает алгоритм «сжатия» Бабушкина. Что-то он действительно жал

Была методика цепных дробей озвучена в эпоху МК/БЗ-калькуляторов в «НиЖ». Там предлагалось экономить для памяти, используя эти алгоритмы вроде как. Сейчас не помню уже.

swwwfactory ★★
()
Ответ на: комментарий от esandmann

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

anonymous
()
Ответ на: комментарий от Miguel

[offtopic] обана! Мигель, а ты не из Питера, часом...я вот Ирландскими танцами занимаюсь, есть мнение, что мы как-то пересекались на выступлении. [/offtopic]

anonymous
()

Единственный минус - ТС ничего не понимает ни в программировании, ни в математике.

aedeph_ ★★
()
Ответ на: комментарий от esandmann

Интересный тред вышел. А я просто пытался изобразить ананимуса

Фу таким быть.

anonymous
()

Читай про Futamura projections ака суперкомпиляцию.

anonymous
()

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

ок. Давай дам тебе пример задачи: отсортировать массив в 100 символов. Всего существует 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 вариантов.

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

давай решим задачу по другому. Разделим массив пополам. Получится 30414093201713378043612608166064768844377641568960512000000000000 вариантов. Это намного меньше. Ура. Давай ещё раз пополам(25 символов), ещё(12), и ещё(6), ну и ещё(3). Бинго! Всего 6 вариантов решения.

Проблема в том, что мы с тобой только что придумали quick sort...

emulek
()
Ответ на: комментарий от ilammy

Теперь осталось понять уроки информатики — информации не становится меньше просто так.

ВНЕЗАПНО «просто так» её становится БОЛЬШЕ! Энтропия растёт. Поясню на простом примере: Информации в сумме двух чисел ровно на 1 бита больше, чем в аргументах (т.е. если сложить 2 байта результат занимает 9 бит). Откуда берутся лишний бит?

Разгадка проста: если сумма равна 5, а одно из слагаемых 3, то очевидно, второе слагаемое 2. Вопрос: КАКОЕ? Ответ на этот вопрос очевидно и весит ровно 1 бит.

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

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.