Pull to refresh
3
0
Ju Pk@JuPk

User

Send message

Можете рассказать подробнее какого рода проектирование вы делали на идрисе? И собственно почему там была важна формальная верификация.

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

До чего уж там, С++26 на подходе, там линейная алгебра из коробки будет работать. Правда, некоторые вещи из С++20 были реализованы только недавно, или полностью не реализованы до сих пор, так что от появления стандарта до его полноценной реализации проходит лет 5, не меньше. Осталось лишь лет 5 подождать, и в 2030-м 3rd-party библиотеки линейной алгебры будут не нужны)

  1. https://latexguide.org/

  2. см. п. 1

  3. Для написания естественно-научных статей и книг (не обязательно научных).

Первое что приходит на ум - графики на бесконечности. В Математике делать такие графики появилась возможность в 2023, а в Мейпл вроде еще в 90-х. Так что ответ на вопрос кто у кого что заимствует не совсем однозначный.

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

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

Быстро как в С все равно не выйдет
Быстро как в С все равно не выйдет

Это цитата из замечательной книжки "The algorithm design manual". Сам я регулярно пользуюсь Математикой уже лет 15, и ее сильные и слабые стороны я примерно представляю. Мои немногочисленные эксперименты с реализацией алгоритмов в "чистой Математике" согласуются с диапазоном значений приведенном в цитате. Математика - не замена машинному коду. Но для символьных и многих (но не всех) численных вычислений это просто фантастический инструмент.

Как я понимаю, PARI это твой рабочий инструмент?

Кстати, вычислительное ядро Математики тоже бесплатно, называется WolframEngine, там вроде даже нет ограничения на число ядер. По сути, это Математика без фронт-энда, то есть никаких подсказок, никакой подсветки синтаксиса, никаких ноутбуков с графиками - только вычислительное ядро. Можно запускать в интерактивном режиме, как PARI, а можно написать и запустить скрипт. Если уж как-то ухитрился написать код без подсветки синтаксиса и подсказок, то всей вычислительной мощностью можно пользовать абсолютно бесплатно. К тому же разрабатывается бесплатный фронт-энд, тут не так давно была статься на эту тему.

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

Иллюстрация того что на точности можно не экономить
Иллюстрация того что на точности можно не экономить

Чтобы вычислить 1'000'000 знаков числа e будем работать с точностью в 2'000'000 знаков. За 2 с небольшим секунды получаем ответ, который затем проверям с помощью точного значения e - весь миллион цифр идентичен. На это потребовалось 100М оперативы. Пока я пишу это сообщение PARI/GP работает уже минут 10 и занимает примерно столько же Гб.

Да, степень в Математике вещественная, а не целая. С целой степенью вычисления будут гораздо дольше, и с 24500 знаков и Математика и PARI/GP считают за одинаковое время, на моем компе это 20с. Но тут вопрос в другом - если мне нужны лишь значащие цифры, то какая разница с помощью какой арифметики они получены? Кстати, есть ли возможность задать вещественную степень в PARI/GP?

Итак, результат любого деления/умножения/степени c участием обычного float имеет тип обычного float.

Тут нет ничего удивительного, берется минимальная точность. Если один операнд известен только с 2 значищими цифрами, а другой 20'000, то какой смысл считать 20'000 знаков результата? Результат может быть точен настолько насколько точны входные данные.

Вот сколько неочевидных моментов....

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

Опять же, эксперименты с определением наименьшего числа знаков с которым расчет еще работает представляют практический интерес разве что для разработчиков систем копьютерной алгебры. Я всегда задавал значение заведомо намного большее чем было нужно. Один раз для решения не очень большой задачи линейной оптимизации, которую нужно было решить очень точно для миллионов разных значений параметров. Математика может выдать точное рациональное решение, но по времени это было раза в три медленнее, чем решать ее с 500 десятичных знаков точности, хотя для конечного решения вполне хватило бы и 50. Но чтобы уж наверняка увеличил число знаков в 10 раз. Если бы нужно было решить всего для нескольких значений параметров, то можно было бы просто точно решить в целочисленной арифметике, но для нескольких миллионов параметров вещественная арифметика съэкономила несколько недель без потери точности. Кстати, разница между решением со 100 знаками и с 500 была намного меньше 5, так что во многих случаях скупиться на точность смысла нет.

Это, похоже, окончательное решение вопроса как правильно работать с такими числами в Математике)

(N[1 + 1/10^24443, 24500])^N[10^24443, 24500] // Precision

57

24500 - 24443 = 57. Совпадение? Не думаю)

Большей точности быть и не может. Для простоты рассмотрим совсем маленькие степени, например

N[1+1/10^3, 5] = 1.0010

Математика воспринимает точность буквально, то есть цифры за последним нулем могут быть какие угодно.

А вообще все эти игры с числами вроде 24500 имеют смысл только тогда когда нужно выяснить минимальное число знаков с которым расчет все еще выдает осмысленный результат. Если же нужно просто посчитать, то лучше задать знаков побольше. Математика работает очень шустро с гигантскими числами, можно спокойно указывать и в два раза больше знаков, и в 10 раз больше. Экономить разряды нужно когда они начинают исчисляются десятками миллионов, тогда можно съэкономить несколько секунд, а с "маленькими" числами с ~100'000 цифрами о числе разрядов можно вообще не думать.

Только сейчас понял что 10^10'000'000'000 = 10^10^10, так что название для масштаба напрашивается само собой - три десятки) На мощном (i9-13900K) но уже не топовом процессоре этот расчет занимает менее 10 минут.

Математика пытается контролировать значащие цифры. В прочессе вычислений младшие разряды могут быть некорректными, и точность теряется. То есть начав с 25'000 цифр, Математика может гарантировать корректность только примерно 500 в этом возведении в степень. Если нужны все 25'000 в конечном результате, то начать нужно с гораздо большего количества цифр.

Если поднять точность до 50000, то получается простыня...

Потому я и обрезал ответ до 100 знаков, чтобы не было простыни)

Думаю, что проблема в этом. Если использовать меньше знаков чем степень 10ки, то дробь просто теряется, если как минимум столько же, то дробь не обнуляется.

Кстати, а зачем ты (можно так?)

Без проблем, уже давно не обращаю внимание на эти формальности)

указываешь точность в миллиардах знаков?

С Математикой я плотно работаю уже более 10 лет, и ее численные возможности я боле-менее представляю, так что стало интересно действительно ли она так лажает. Ну и вообще, каковы пределы ее возможностей. Само по себе вычисление числа e таким способом большой ценности не представляет, но как тест для сравнения разных систем компьютерной алгебры вполне подходит.

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

Null потому что там в конце стоит ; Это специально для того чтобы не выводить 10^1'000'000'000)

100 знаков я выбрал для того чтобы все поместилось в один экран. Выражение сначала вычисляется с той точностью с которой задано n, то есть с миллиардом цифр, а уж потом округляется до 100 цифр. Проверял и с точностью 10'000, результат такой же.

1

Information

Rating
6,708-th
Registered
Activity

Specialization

Десктоп разработчик
Linux
C
C++