РАСШИРЕНИЕ МОЩНОСТИ УРАВНЕНИЯ ПИФАГОРОВЫХ ТРОЕК

EXTENSION OF THE POWER OF THE EQUATION PYTHAGOR'S TRIPLETS
Цитировать:
Тихомиров Е.П., Васильев А.В. РАСШИРЕНИЕ МОЩНОСТИ УРАВНЕНИЯ ПИФАГОРОВЫХ ТРОЕК // Universum: технические науки : электрон. научн. журн. 2023. 3(108). URL: https://7universum.com/ru/tech/archive/item/15168 (дата обращения: 25.04.2024).
Прочитать статью:

 

АННОТАЦИЯ

В предыдущей статье «Исследование мощности уравнения Пифагоровых троек»[1] мы сформулировали задачу для исследования. В настоящей статье рассмотрим модификацию программы для вычислений и проведем анализ уравнения для нового случая.

ABSTRACT

In the previous article “Investigation of the power of the Pythagorean triples equation” [1], we formulated the problem for the study. In this article, we consider a modification of the program for calculations and analyze the equation for a new case.

 

Ключевые слова: пифагоровы тройки, мощность, теория чисел.

Keywords: pythagorean triples, cardinality, number theory.

 

В предыдущей статье «Исследование мощности уравнения Пифагоровых троек»[1] мы сформулировали задачу для исследования. В настоящей статье рассмотрим модификацию программы для вычислений и проведем анализ уравнения для нового случая.

В предыдущем случае местом вызывающем переполнение типа int64_t были значения x*x, y*y, z*z при проведении проверки корректности решений.

Перепишем процесс проверки решений таким образом: допустим, нам известны числа x, y и z. Получим из них искомые числа i и j. Заметим, что мы можем сделать это двумя разными способами.

1) i1 = sqrt((z+y)/2)

    j1 = sqrt((z-y)/2)

2) i2 = (sqrt(z-x)+sqrt(z+x))/2

    j2 = (sqrt(z+x)-sqrt(z-x))/2

В таком методе вычисления, мы не превышаем величину в 263 [2].

Перепишем программу и проанализируем результаты вычислений:

 

#include <stdio.h>

#include <inttypes.h>

#include <unistd.h>

#include <math.h>

 

int check(int64_t x, int64_t y, int64_t z, int show){

double i1, j1, i2, j2;

i1 = sqrt((z+y)/2);

j1 = sqrt((z-y)/2);

i2 = (sqrt(z-x)+sqrt(z+x))/2;

j2 = (sqrt(z+x)-sqrt(z-x))/2;

if(show) printf(" %"PRIu64" %"PRIu64" %"PRIu64" %"PRIu64"\n", i1, i2, j1, j2);

return (i1!=i2 || j1!=j2) ? 0:1;

}

 

int main()

{

int64_t x, y, z, i, j, i0, j0;

long int counter=0;//добавим счетчик треугольников пифагора

FILE *f;

char str[1024];

//прочитаем последнюю запись лога, чтобы не считать все заново при перезапуске

f = fopen("log.txt", "r");

while(fgets(str, 1024, f)){

sscanf(str, "x:%"PRIu64" y:%"PRIu64" z:%"PRIu64" i:%"PRIu64" j:%"PRIu64"\n", &x, &y, &z, &i, &j);

}

i0 = i;

j0 = j+1;//выбираем следующий треугольник

printf(" \n", i0, j0);

//return 1;

 

for(i=i0;i>0;i++)//не будем ограничивать сверху цикл,

{ //оставим только проверку на переполнение

for(j=j0;j<i && j>0;j++)//проверка на переполнение

{

x = 2*i*j;

y = i*i-j*j;

z = i*i+j*j;

if(/*x*x+y*y!=z*z || x*x<0 || y*y<0 || z*z<0 || x<0 || y<0 || z<0*/!check(x, y, z, 0))

{//включаем проверку переполнения

printf("ошибка в вычислениях\n");printf("error in math\n");

//выведем текущие значения и выбросим ошибку

printf("x:%"PRIu64" y:%"PRIu64" z:%"PRIu64" i:%"PRIu64" j:%"PRIu64"\n", x, y, z, i, j);

return 1;

}

counter++;//инкрементируем счетчик

if((counter % 1000000000)==0){

//на 1 миллиард выбрасываем текущее значение и обнуляем счетчик

printf("x:%"PRIu64" y:%"PRIu64" z:%"PRIu64" i:%"PRIu64" j:%"PRIu64"\n", x, y, z, i, j);

//запишем значение в лог-файл

FILE *f;

f = fopen("log.txt", "a");

fprintf(f, "x:%"PRIu64" y:%"PRIu64" z:%"PRIu64" i:%"PRIu64" j:%"PRIu64"\n", x, y, z, i, j);

fclose(f);

counter=0;

}

//usleep(5);//дадим отдохнуть процессору 5 миллисекунд

}

j0 = 1;

}

return 0;

}

Рассмотрим ограничения, которые могут встретиться при работе над проверкой треугольников.

Теория предсказывает, что первое переполнение типа будет при i ~ 231 [4].

Если оценить время на вычисление всех треугольников для новой программы, в годах, то получится примерно 2*109 сек ~ 100 лет.

Оценка ограничения мощности решений уравнения Пифагоровых троек.

Теоретическая - на основе уравнения: z= i2+j2 и возможного максимального значения z = 263.

Получены значения i=2 147 483 647.

И экспериментального, методом подбора значений i и j, при которых происходит сообщение об ошибке.

Получены значения i=1 518 500 251, j=1 518 500 249

Необходимо отметить, что экспериментально получено минимальное значение, при котором происходит переполнение.

Вычислим мощность уравнения Пифагора для экспериментального значения:

Количество решения для каждого шага i равно Ni=i*(i-1)

Если просуммировать все Ni, то получим интеграл:

i3/3-i2/2, где i от 2 до экспериментального значения.

Подставив пределы в формулу, получим число примерно ~1027.

Таким образом, мощность последней программы на вычисления троек 1027

Сравним полученную мощность со значением из статьи: [1]

i = 38 969

Мощность ~ 1012

Таким образом, для модифицированной программы мы получили выигрыш в 1015 раз.

 

Список литературы:

  1. Тихомиров Е.П., Васильев А.В. “ИЗУЧЕНИЕ МОЩНОСТИ УРАВНЕНИЯ ПИФАГОРОВЫХ ТРОЕК”, СТУДЕНЧЕСКИЙ, 2021, № 1-2(129), 11-14
  2. Длинная арифметика в c++. http://cppstudio.com/post/5036/
  3. Пифагоровы тройки чисел. Выписка из свободной энциклопедии «Википедия» от 26.10.2016.
  4. Выгодский М. Я. Справочник по элементарной математике. Москва, 2006. С. 509
Информация об авторах

генеральный директор ТОО Монолит-Экибастуз, Казахстан, г. Экибастуз

LLP Monolit-Ekibastuz, Kazakhstan, Ekibastuz

д-р физ.-мат. наук, проф., Новосибирский Научно-Исследовательский Университет, РФ, г. Новосибирск

science advisor, doctor of phys. and math., professor Novosibirsk State University, Russia, Novosibirsk

Журнал зарегистрирован Федеральной службой по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор), регистрационный номер ЭЛ №ФС77-54434 от 17.06.2013
Учредитель журнала - ООО «МЦНО»
Главный редактор - Ахметов Сайранбек Махсутович.
Top