Эффективно вычисление всего пифагорейца утраивает знание hypoteneuse

Учитывая hypoteneuse (c в типичном уравнении a*a + b*b = c*c), из чего эффективный путь состоит в том, чтобы вычислить все возможные целочисленные значения a и b, таким образом, что a < b?

Примечание: Я видел c будьте больше, чем 1e12, таким образом c*c больше, чем long.MaxValue, от того, что я могу сказать, c*c действительно вписывается в a decimal,все же.

7
задан ckknight 28 January 2010 в 01:38
поделиться

5 ответов

Как насчет:

SELECT CAST(CAST(@number AS float) AS varchar(10))

, однако, вы можете осторожно проверить это с помощью ваших необработанных данных.

-121--3107603-

Существует математическое решение, которое находит A и B быстро даже для больших значений C. К сожалению, это не так просто. Я пытаюсь дать краткое объяснение алгоритма. Я надеюсь, что это не слишком запутанно.

Так как C дан, и вы ищете A и B, вы в основном хотим решить диофантин Уравнения формы

n=x^2+y^2,

где n дается. Это не помогает так много, что n = c * c - квадрат, и, таким образом, я описываю решение для любого n. Если бы не было главным числом, вы могли бы использовать Теорема Ферма , решать, следует ли ваше уравнение разрешимо, и использовать, так как инон указывал на гермит-сервер Algoritm, чтобы найти решения, если есть какие-либо.

Чтобы решить случай, когда N не просто, это хорошая идея использовать Гауссовские целые числа . (Гауссовские целыми числами являются просто сложные числа со своими ценными коэффициентами). В частности, один отмечает, что норма X + Yi представляет собой

N(x+yi) = x^2+y^2.

, следовательно, нужно найти целые числа гауссов X + Yi, чья норма n. Поскольку норма является мультипликативным, достаточно решить это уравнение для факторов N, а затем размножить гауссовских целых чисел индивидуальных уравнений. Позвольте мне привести пример. Мы хотим решить

65 = x^2 + y^2.

Это эквивалентно найти X, Y такое, что

N(x+yi) = 65

над гауссовыми целыми числами. Мы фактор 65 = 5 * 13, то мы используем Fermat, чтобы отметить, что оба 5 и 13 могут быть представлены как сумма двух квадратов. Наконец, мы находим либо, используя грубую силу, используя алгоритм Hermite-Serret

N(2+i) = N(1+2i) = ... = 5
N(2+3i) = N(3+2i) = ... = 13

, я оставил целые числа гаузера 2-I, -2 + I и т. Д. с отрицательными коэффициентами. Это тоже, конечно, решения тоже.

Следовательно, мы теперь можем умножить эти решения вместе, чтобы получить

65 = 5 * 13 = N (2 + I) * N (2 + 3i) = n (((2 + I) * (2 + 3i))) = N (1 + 8i)

и

65 = 5 * 13 = N (2 + I) * N (3 + 2i) = N (((2 + I) * (3 + 2i)) = n (4 + 7i).

Следовательно, можно получить два решения

1*1 + 8*8 = 65
4*4 + 7*7 = 65

Другие комбинации E.g. При негативных коэффициентах тоже нужно проверять. Они не дают новых решениях, кроме перестановок и измененных знаков.


Чтобы вычислить все решения, которые можно также добавить, что нет необходимости вычислять C * C. Нахождение факторов C - это все, что необходимо. Также поскольку A и B оба меньше, чем C, этого не произойдет, что продукты Gaussian целых чисел не представлены с 64-битными целочисленными коэффициентами. Следовательно, если осторожно осторожно, 64-битное целое число достаточно точно для решения проблемы. Конечно, всегда проще просто использовать язык, такой как Python, который не имеет таких проблем переполнения.

6
ответ дан 6 December 2019 в 19:36
поделиться

Существует несколько способов расширения приложения Rails и / или выключить Отказ Вы упомянули только один из больших четырех. Другие:

  • Плагины
  • Двигатели
  • Гемы
  • шаблоны
  • Шаблоны

Шаблоны обычно используются для запуска приложения, но если они разработаны правильно, вы можете использовать их для продления. Например, многие шаблоны сток-шаблоны, помогают настроить репозиторий кода, установить несколько плагинов / драгоценных камней, и, возможно, немного исправить макет, чтобы вам не нужно. Конечно, вы обычно делаете большинство из них, когда вы впервые начните проект. В нашей компании (3 разработчиках) я создал шаблон, который устанавливает наши оформления DEV и производства, репозитории, отслеживание проекта. Вот мой любимый фондовый шаблон: http://github.com/lhoeg/app_lego/network (Оригинал не сделал много работы на нем через некоторое время, и я считаю, что это лучшая вилка там сейчас)

плагины и драгоценные камни более или менее становятся синонимичными, и больше не имеет большого значения для людей, чтобы создавать плагины Как драгоценные камни являются более стандартным рубрием способом упаковки функциональности. Обычно вы будете использовать плагины, чтобы добавить биты очень специфических функций в ваше приложение. Это может варьироваться от добавления аутентификации пользователя, в календарирование, добавлять местоположения и отображение в ваше приложение. Большинство плагинов, которые я использовал, расширяет Activerecord или база данных части приложения. Если плагин поставляется с видами, контроллерами или изменяет свои таблицы базы данных, он обычно поставляется с генератором. Хорошим примером является восстановленный генератор плагина аутентификации. Относительно хороший список http://agilewebdevelopment.com/

Двигатели - это короли модульности. Они обычно обеспечивают намного больше функциональности, чем плагины. Принимая во внимание, что плагины и драгоценные камни обычно расширяют рельсы, двигатели намерены расширять ваше приложение, добавив полный набор видов, контроллеров и моделей. Таким образом, двигатели являются целые приложения Rails, упакованные в аккуратную маленькую коробку, которую вы можете просто Plop в ваше приложение и мгновенно добавить кучу функциональности. Есть также каталог двигателей в http://agilewebdevelopment.com/ , но, как вы увидите, там не очень много.

Надеюсь, это поможет!

Бернс

-121--4244760-

Начните со значения 1 для A и значение C для B.

Сравните C * C - B * B на A * A . Если они равны, у вас есть матч.

Измените A и B по отношению друг к другу в зависимости от того, какая сторона больше, пока они не одинаковы.

0
ответ дан 6 December 2019 в 19:36
поделиться

Порядок присоединения имеет значение только в том случае, если вы указываете опцию (завод Force) . В противном случае оптимизатор переставит ваш запрос в зависимости от того, что он считает наиболее эффективным.

На самом деле есть определенные экземпляры, где я нахожу, что мне нужно использовать Заказ силы , но, конечно, они мало и далеко друг от друга. Если вы не уверены, просто установите статистику [Время | IO] на и убедитесь для себя. Вы, вероятно, обнаружите, что ваша версия работает медленнее, чем оптимизированная версия, если не все случаи.

-121--4293892-

Учитывая C:

, поскольку B> A, если A - минимум (A = 1), B = SQRT (C * C - 1).

Следовательно, B должно быть между этим значением и C -1.

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

Now, a property of squares:
The squares are: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, ...
The differences: -, 3, 5, 07, 09, 11, 13, 15, 17, 019, 021, ...
That means a square can be written as a summation of ODD numbers:
    1 + 3 + 5 + 7 + n+...
where n = number the summation is a square of.

Итак, имеется именно C квадратных чисел меньше, чем C * C, и вы можете идентифицировать их с помощью простого вычитания.

Вернуться к началу, принимая B = SQRT (C C - 1), округление и принимая B B, мы получаем квадрат B, необходимо выше, а A = 1. Найти C C - (A A + B B). Это должно дать вам номер, который должен быть добавлен для достижения C * C.

Так как вы можете добавить 3 + 5 + 7 + ... , а B + 2 + B + 4 + B + 6 + ... до B, Вам просто нужно найти правильный срок, основанный на суммах, а не на самом квадрате:)

0
ответ дан 6 December 2019 в 19:36
поделиться

может также пойти на библиотеку Bignum.

Что касается эффективного способа поиска A и B:

для каждого значения B (начиная с C-1 и идет вниз до B * B

0
ответ дан 6 December 2019 в 19:36
поделиться

Все пифагорейские тройки (a,b,c) удовлетворяют свойству, которое для некоторых целых чисел k,m и n,

a=k(m^2-n^2), b=2kmn, c=k(m^2 + n^2)

Так что начните с факторинга c. Затем для каждого отдельного коэффициента k из c (т.е. для каждого отдельного подмножества коэффициентов, умноженного вместе), найдите все m и n, которые удовлетворяют c/k = (m^2 + n^2). Выполнение последнего займет значительно меньше времени, чем предложенный другими подход брутальной силы (вместо c^2 нужно найти только квадраты, которые удовлетворяют c/k), но при этом будут идентифицировать все тройки (a,b,c). Вам также не нужно использовать бинум, потому что все промежуточные результаты помещаются в длину.

Я также предлагаю вам заглянуть на веб-страницу http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Pythag/pythag.html под заголовком "Более общий пифагорейский тройной калькулятор", который содержит встроенный калькулятор, написанный на языке javascript, который делает именно то, что вы хотите.

7
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: