Ludmila - решение нерешенных математических задач методом подбора
Описание
Скрипт Ludmila предназначен для решения нерешенных математических задач методом подбора.
Есть список элементов уравнений:
- числа (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
- операции (+, *, /, -)
- скобки (левая, правая)
- степень (квадратная, кубическая, корень квадратный, корень кубический)
- x (может быть несколько в наборе - x0, x1, x2, …)
Есть входящие наборы данных:
- data1.txt (линейное уравнение)
- data2.txt (теорема пифагора)
- data3.txt (ряд простых чисел)
Например набор data1.txt (линейное уравнение) выглядит вот так:
3235 51 62 73
3350 52 63 74
3467 53 64 75
… и т.д. (всего 100 элеметов в наборе)
Первая цифра значение y, последующие цифры значения x (в данном случае x0, x1, x2)
Для нахождения верного уравнения перебираются комбинации уравнений. Выглядит это примерно так:
y = 1
y = 2
…
перебираются все уравнения длинной 1, затем длинной 2. Уравнения длинной 3 могут выглядеть например так:
y = 1 + x0
y = 1 + x1
… и так далее, пока не дойдет до:
y = x0 * x1 + x2
В итоге набор данных (3235 51 62 73) выдаст совпадение, далее эта форумла перебирает все наборы данных data1.txt их всего 100 штук. И если все 100 наборы данных прошли проверку, то уравнение считается решенным.
Оптимизация
Так как нет смысла уравнения в котором рядом стоят например два оператора +, поэтому есть правила конкатенации - что может стоять рядом друг с другом, а что нет. В результате чего скорость работы скрипта была увеличина в 15 раз. Правила конкатенации находятся в config.py, переменная types.
Производительность
Производительность на CPU:
- Линейное уравнение решается за 7 секунд (5 символов) v|x0;o|*;v|x1;o|+;v|x2
- Теорема пифагора решается за 8100 секунд (8 символов) bl|(;v|x0;e|**2;o|+;v|x1;e|**2;br|);e|**0.5
Задачи
Главной задачей данного скрипта является решение нерешенных математических задач
- Открытые математические проблемы (https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BA%D1%80%D1%8B%D1%82%D1%8B%D0%B5_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B)
- Задачи тысячелетия (https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D1%82%D1%8B%D1%81%D1%8F%D1%87%D0%B5%D0%BB%D0%B5%D1%82%D0%B8%D1%8F)
Но не все они могут быть представлены в виде наборов данных.
To Do
- Переделать, чтобы вычисления производились не на CPU, а на GPU (CUDA).
- Добавить больше математических операций - sin, cos, tg, ctg, π, e, log (упадет производительность, но увеличится вероятность нахождения формулы).
- Добавить наборы данных для других нерешенных математических задач.
Запуск
- в файле config.py в переменной data_id указать id набора данных (1 - линейное, 2 - теорема пифагора, 3 - ряд простых чисел)
- запустить файл ludmila.py командой:
c:\Python37\python e:\python\maths\ludmila.py
- результат будет в консоле, а так же в лог файле log.txt
Вопросы
У меня есть два вопроса к сообществу:
- Есть ли подобные скрипты? Возможно кто-то уже делал такое и мой скрипт бессмысленный потому что эта работа уже проделана кем-то другим.
- Вопрос к тем кто работал с CUDA. Сейчас вычисления производятся на CPU. Возможно ли переделать на GPU тем самым повысив производительность в десятки раз?
Ссылка на исходники
https://github.com/nevstas/ludmila