СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Пересчитывая Рамануджана в черновиках

Размышляя над тем, как получить сотый знак при делении единицы на число пи, я обратился к тем формулам, которые выработало человечество. Автором одной из них является поразительный индийский математик Рамануджан. Не буду излагать его жизнь и результаты, все это есть в Сети. Скажу только, что это удивительный человек, который образно говоря, «разговаривал» с числами, причем каждое натуральное число было его личным другом. Будучи очень религиозным человеком, Рамануджан, по видимому, видел в мире чисел и в отношениях, которыми этот мир пронизан, проявление божественной гармонии и красоты. И раз Всевышний говорит с нами через откровения, то такой же подход Рамануджан использовал к изучению математики. «Его понимание сущности математического доказательства было более чем туманным; он пришел ко всем своим результатам, как ранним, так и более поздним, как верным, так и неверным, при помощи странной смеси интуитивных догадок, индуктивных соображений и логических рассуждений». Так говорил его современник. А теперь формула Рамануджана:

С моей точки зрения это что-то невозможное! Обычный человек не в состоянии прийти к такому выражению. При этом надо учесть, что до 27 лет Рамануджан занимался математикой сам для себя, не имея контакта с серьезными специалистами.
Все расчеты я проводил на платформе 1С: Предприятие, редакция 8.2. Спасибо разработчикам, что они реализовали в программе длинную математику для умножения и сложения, это очень упрощает жизнь. Для деления есть ограничение в 27 знаков после запятой, поэтому деление пришлось реализовать самому. Но обо всем по порядку.
Первая задача – уметь вычислять √2 с любой точностью. Для этого обычно ищут ноль следующей функции:
f(x)=x⊃2;-2,
С этой целью используют итерационную формулой Герона, в которой a=2:

Но если у вас нет длинного деления, когда вы можете указать количество значащих цифр после запятой, то точность вычислений по данной формуле будет ограничиваться точностью деления, которая реализована в системе. В 1С это 27 знаков и именно такую минимальную погрешность я смог получить. Тогда я решил проверить, как будет работать разложение в ряд Тейлора для функции квадратный корень из (1+х). Ниже приводится соответствующая формула для разложения.

Отметим, что каждый последующий член ряда отличается от предыдущего знаком и коэффициентом 0.5*x*(2-3/n). Корень из двух я планировал получить, используя тождество:

С этой целью значение ряда вычислим в точке 1/49. Для того, чтобы обойти ограничения на точность конечного результат от представления результатов деления, число 1/49 будем представлять следующим образом. Дробь 1/7 имеет период 142857, поэтому сначала сформируем десятичную запись данной дроби с количеством знаков после запятой, которое определяется требуемой точностью расчетов, затем полученное значение умножим само на себя. А вот множитель (2-3/n) я оставил таким, какой он есть. Формула готова осталось проверить, как она работает. Результат я сравнивал с данными, которые выдает www.wolframalpha.com. Для точности в 100 знаков после запятой потребовалось 57 членов ряда, результат совпал с эталонным значением. По-видимому, я стал первым человеком на планете, который провел вычисление корня из двух в 1С с такой точностью.

Разумеется, все благодаря тому, что для тех задач, которые реализуются на данной платформе это совершенно не нужно. Но это был только первый шаг к использованию формулы Рамануджана. Последующие эксперименты показали, что без реализации длинного деления продвинуться за 27 значащих цифр нельзя. Поэтому я написал функцию ДлинноеДеление, которая вычисляет дробь 1/x, где х это первый аргумент функции, а количество знаков после запятой — второй. Проверку правильной работы данного алгоритма рекомендую проводить на выражении 1/9801, результат некоторых думаю удивит.
Функция ДлинноеДеление(вхЗнаменатель,вхТочность) экспорт
	перем выхРезультат;
	
	если вхЗнаменатель=1 тогда
		возврат 1;
	конецесли;	
	
	
	выхРезультат=новый массив;
	мЧислитель=10;
	пока Истина цикл
		пока мЧислитель<вхЗнаменатель цикл
			выхРезультат.Добавить(0);
			мЧислитель=мЧислитель*10;
		конеццикла;	
		
		число=0;
		пока мЧислитель>=вхЗнаменатель цикл
			мЧислитель=мЧислитель-вхЗнаменатель;
			число=число+1;
		конеццикла;
		
		пока число<>0 цикл
			остаток=число%10;
			выхРезультат.Добавить(остаток);
			число=(число-остаток)/10
		конеццикла;
		
		
		если мЧислитель=0 тогда
			прервать;
		конецесли;
		
		если выхРезультат.Количество()>=вхТочность тогда
			прервать;
		конецесли;
		мЧислитель=мЧислитель*10;
	конеццикла;
	
	результат=0;
    разряд=0.1;
	для каждого цифра из выхРезультат цикл
		результат=результат+разряд*цифра;
		разряд=разряд*0.1;
	конеццикла;	
	возврат результат;
КонецФункции

Теперь формула, которую открыл Сриниваса Рамануджан Айенгор показала всю свою мощь. Проверка полученного числа проводилась с помощью www.wolframalpha.com.

Для демонстрации результатов вычисления был построен график функции tg(10^x), где х принимает целые значения. Впрочем, особой красотой он не отличается, что и понятно из характера анализируемой последовательности цифр.

После этого уже не было никаких преград для определения значения выражения tg(10⊃1;∨dm;∨dm;). Я отбросил целое количество пи, и оставил 0.12*пи. Первый член в разложении tg(x), который равен х, дает нам следующее значение:
0.12*пи=3/25*пи≈3*1/8=3*0,125=0,375.
Если учесть второй член разложения, то к приведенному значению надо будет добавить (0,375)⊃3;/3. Заменяем выражение в скобках на 0.4, выполняем элементарные операции и получаем 0,021. Тогда уточненная оценка будет 0,396. На этом и остановимся.
Заключение

Данная статья является примером того, как в 1С можно выполнять вычисления с любой заданной точностью. В статье не утверждается, что такие вычисления следует проводить именно c помощью 1С. Разумеется, существуют другие инструменты и языки. Но оказывается, что при небольших усилиях это можно реализовать и на данной платформе. Для меня это было маленьким открытием, которым я и поделился.

комментарии (15)

+19
+20 –1
vilgeforce ,  

В Питоне есть длинная математика. В отличии от Питон бесплатен и куда как более подходит для обучения. При делении и там есть ограничение на число знаков, но оно обходится сторонними модулями.

+10
encyclopedist ,  

Внимание, замечены формулы в JPEG!

+12
+13 –1
KvanTTT ,  

Внимание, замечено 1С!

+21
mephistopheies ,  
Данная статья является примером того, как в 1С можно выполнять вычисления с любой заданной точностью.

но зачем?

Представляет ценность для преподавателей информатики

не представляет

и тех, кто связан с обучением программированию в среде 1С

мне, как преподавателю почти информатики (преподаю машинное обучение), кажется, что крайне противопоказано неокрепшему уму рассказывать что в одинэс можно делать серьезную математику, они ведь по глупости своей могут поверить, и потратить долгое время на то, что бы наконец открыть для себя матлаб, R или питон, для работы с математикой
+9
Nordvind ,  

Какой тонкий пиар 1с.

+3
garex ,  

Ога. В питоне и руби bignum`ы уже встроены, в php есть bcmath и gmp. В прочих языках также имеются библиотеки.

+1
ilammy ,  

Мне очень хочется верить. что человек просто использует наиболее привычный инструмент, как, к примеру, в этом рассказе о простых числах.

+1
fishbone ,  

Недавно стояла задача загрузить файл сметы из ПО Гранд-Смета в 1с, с условием что итоговая сумма в 1с должна сойтись с итоговой суммой в ГрандСмете. Под конец недели я тоже начал разговаривать с числами и формулы были очень похожи на рамануждановские.

0
mikhaelkh ,  

Правильный ответ:
tg(10^100)=0.40123196199081435418575434365329495832387026112924406831944153811687180982211912114672673…

0
stepanovD ,  

я запомню это число и буду на спор его «вычислять» в уме :-)

0
zag2art ,  

Это даже не микроскопом гвозди забивать, а скорее гвоздем по микроскопу…

+2
Suvitruf ,  

Давайте теперь каждый напишет статью, «как вычислить #формула# до #число# знаков после запятой с помощью 1C».

Если надо что-то подобное посчитать с большой точностью, разумный человек воспользуется чем-то вроде matlab.
Если смысл статьи показать занятные формулы Сриниваса Рамануджана, то без разбора полётов не особо интригует.
Если же смысл в том, что 1C умеет длинную арифметику, то вообще нет слов, учитывая, что вы сами привели ссылку на статью, где про это говорится.

0
Silf ,  
Давайте теперь каждый напишет статью, «как вычислить #формула# до #число# знаков после запятой с помощью 1C».

Давайте не будем
–2
scientes ,  

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

–1
mikhaelkh ,  

Напишите лучше длинные вычисления на Brainfuck.