Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Вот хорошо-бы Пифагоровых троек нагенерить. Пример: Код: powershell 1. 2. 3. 4. 5. P.S. Всех с наступающим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 15:28 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Вот чуть больше 850 миллионов Код: plaintext 1. 2. 3. Думаю надо усложнить задачу добавив условие что хоть одно из чисел простое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 18:23 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Гипотенуза растёт монотонно. Хм. Можно взять ее за основу. Как аргумент а катеты подбирать целочисленно. Хочется избавится от квадратного корня. И в некотором вырожденном виде существуют треугольники (0,5,5), (0,10,10). Можно старотвать развёртку угла с этого чахлого треугольника и разворачивать вплоть до 45 градусов. Дальше нет смысла т.к. будет зеркальное отражение уже найденных Пифагорских троек. А для ускорения расчёта катетов можно попробовать алгоритм Брезенхейма для рисования дуги окружности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 18:23 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima T, да. Кст. подобные надо как-то удалять. На каждый найденный пифагорец надо быстринько поискать в базе уже найденых (ох чую нужен Стебелёк) и дропнуть его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 18:24 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
как-то так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. :) PS Пример с числами до 1`000, хотел запостить до 1`000`000 но в форум не лезет. Всем желающим продолжить майнинг: качайте таблицу простых чисел и вставляйте в пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 19:50 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Так известен же общий вид всех пифагоровых троек, так что просто пробежаться по двум параметрам (ну или трем, если хочется и не взаимно простые тройки) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 23:18 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Хех... я постил где-то генерилку primes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 01:27 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext 1. D’oh! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 01:41 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Primegen. По жлобски так. Сердито. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 02:48 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Если оставаться в рамках long, то "взаимно простые" это "остаток целочисленного деления не равен нулю". В чём проблема бежать во вложенном цикле по "2*m+1", считая квадраты и прочие произведения в охранном условии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 13:07 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, ты про это? для некоторых натуральных взаимно простых чисел m > n , разной чётности.... Наоборот, любая такая пара чисел (m,n) задаёт примитивную пифагорову тройку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 13:21 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Да, именно про эту формулу. В целых числах всё должно быть быстренько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 13:22 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Не додумал - в цикле ничего "охранять" не надо. Проверять надо взаимную простоту результатов. Что сложнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 13:29 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovНе додумал - в цикле ничего "охранять" не надо. Проверять надо взаимную простоту результатов. Что сложнее. Так вроде же m и n должны быть взамио простые. Т.е. результат на взаимную простоту проверять не надо. А генерить взаимно простые числа с разной четностью просто: m - степень двойки, n - любое нечетное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 14:37 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Или просто генерить m = n + 1, а n перебирать. Тоже будут взаимно простые с разной четностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 14:44 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Вот так вот пока.... Подобные треугольники еще не фильтруются. pyfagor.cpp Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2014, 00:50 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Ап. С пятницей всех. Внезапно! Пора фильтровать плохие треугольники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:03 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Критерий подобия. (a1,b1,c1) подобен (а2,b2,c2) тогда, когда Или в целых числах более точная формула При этом не забываем разворачивать оба треугольника так чтобы b был больше чем a Пример (8,6,10) и (3,4,5) приводим к (6,8,10) и (3,4,5) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 14:05 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Мне кажется так понятнее так написать k - коэффициент пропорциональности Я выше предлагал использовать простые числа Dima TДумаю надо усложнить задачу добавив условие что хоть одно из чисел простое. Правда не уверен что нет таких троек когда все три числа не простые и при этом нет меньшего подобного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:42 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Нам нельзя вычислять k - как вещественное. Мы рискуем потерять точность на треугольниках большого размера. Рациональная форма вида m/n где оба числа целые позволяет решить эту задачу точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:48 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
По твоему алгоритму проверки все найденные надо со всеми сравнивать на подобие. Это долго. Быстрее с помощью простых чисел меньшее подобное искать, т.е. перебрать все простые числа (k) меньше a и убедится что все три числа не делятся на k без остатка Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:59 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
maytonНам нельзя вычислять k - как вещественное. При наличии полного набора троек всегда будет наименьшая подобная для которой k будет целое т.е. бОльшая подобная выражается как Код: plaintext 1. тут k любое число, (a,b,c) - минимальное подобное т.е. a1 = a * k т.к. a1 и a целые то k тоже должно быть целое Если подходит нецелое k то (a,b,c) - не минимальное подобное Подзабыл как это доказать математически, примерно так: раскладываем a на простые множители m1*m2*m3 находим те которые дают с умножением на k минимальное целое, например m1*m2*k, следовательно m1*m2 это то целое на которое можно разделить исходное (a,b,c) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:41 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Тут по сути вопрос идёт о сравннении стоимостей поиска в бинарных деревьях и стоимостей генерации простых неподобных треугольников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:50 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Мне просто кажется что факторизация всех трёх (или двух?) сторон будет более затратной чем просто binary search. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 17:56 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
maytonТут по сути вопрос идёт о сравннении стоимостей поиска в бинарных деревьях и стоимостей генерации простых неподобных треугольников. Я о принципиально другом подходе к проверке подобных. По твоей формуле надо сравнивать все результаты со всеми, по моей просто узнать есть ли пропорционально меньше, и наименьший считать первым. Проверять на наличие меньшего так: Код: plaintext 1. GetDivider(a, b, c) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. т.е. GetDivider() возвращает наибольший общий делитель для тройки, поделив на который получаем минимально возможную подобную тройку. Если допилить твой код добавив игнор не минимальных, то будет так Генератор Майтона поправленный Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Твой алгоритм я не понял (если честно) но если он генерит все последовательно то дубли отфильтруются. PS В моем примере простые числа до 1000, можно их вычислять, но проще скачать с инета, у меня массив 78498 чисел до миллиона, но исходник в форум не лезет даже в архиве. PPS Ты цель обозначь. Чего ищем? Максимально большое и непрерывную последовательность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 19:55 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima Tнаибольший общий делитель для тройкиЧтобы отбросить очередную тройку достаточно найти любой делитель больше единицы, не обязательно наибольший. И проверять можно не до (a < b ? a : b) >> 1, а до корня из (a < b ? a : b). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 20:10 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Моей таблицы простых чисел до миллиона хватило меньше чем на 5 минут работы твоего алгоритма, закончилось на этом автор(2079301,1810020,2756749) (2076969,1816240,2759081) (2074629,1822460,2761421) (2072281,1828680,2763769) (2067561,1841120,2768489) (2065189,1847340,2770861) (2062809,1853560,2773241) (2060421,1859780,2775629) (2055621,1872220,2780429) (2053209,1878440,2782841) (2050789,1884660,2785261) (2048361,1890880,2787689) (2043481,1903320,2792569) (2041029,1909540,2795021) (2038569,1915760,2797481) (2036101,1921980,2799949) (2028649,1940640,2807401) (2026149,1946860,2809901) (2023641,1953080,2812409) (2018601,1965520,2817449) (2016069,1971740,2819981) (2013529,1977960,2822521) (2010981,1984180,2825069) (2005861,1996620,2830189) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 20:16 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
miksoftDima Tнаибольший общий делитель для тройкиЧтобы отбросить очередную тройку достаточно найти любой делитель больше единицы, не обязательно наибольший. И проверять можно не до (a < b ? a : b) >> 1, а до корня из (a < b ? a : b). Согласен, ступил. Исправил на Код: plaintext 1. Теперь с моей таблицей вместо максимума в 2 миллиона имеем потолок в 1 триллион. Запустил считалку. Думаю тут пяти минут не хватит ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 20:32 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima TЯ о принципиально другом подходе к проверке подобных. По твоей формуле надо сравнивать все результаты со всеми, по моей просто узнать есть ли пропорционально меньше, и наименьший считать первым. Со всеми не надо. Мы можем ввести меру. Или метрику. По смыслу - это котангенс острого угла alpha. Но в нашем примере он может выступать как ключ ранжирования бесконечного множества треугольников. Далее - дело техники. Red and Black Tree и поиск за O(log n). Вычислять его численно не нужно. Но эта дробь может участвовать в операциях поиска в рациональном представлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 20:59 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima TPPS Ты цель обозначь. Чего ищем? Максимально большое и непрерывную последовательность? С твоих слов я не могу понять "критерий непрерывности". Что это в нашем случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 21:12 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
maytonDima TPPS Ты цель обозначь. Чего ищем? Максимально большое и непрерывную последовательность? С твоих слов я не могу понять "критерий непрерывности". Что это в нашем случае? В общих чертах надо задать алгоритм сравнения двух троек на больше/меньше, выставить их в порядке возрастания, тогда непрерывностью будет отсутствие пропусков. Алгоритм ты уже предложил mayton По смыслу - это котангенс острого угла alpha. Но в нашем примере он может выступать как ключ ранжирования бесконечного множества треугольников. Далее - дело техники. Red and Black Tree и поиск за O(log n). Только я не понял это maytonВычислять его численно не нужно. Но эта дробь может участвовать в операциях поиска в рациональном представлении. как сравнить не вычисляя 5/7 и 7/9 ? Думаю как-то так надо: 1. бОльшая тройка имеет бОльшую гипотенузу 2. при равной гипотенузе бОльшая по сумме катетов Кстати интересно есть ли разные тройки с одинаковой гипотенузой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 09:30 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima Tкак сравнить не вычисляя 5/7 и 7/9 ? Думаю как-то так надо: 1. бОльшая тройка имеет бОльшую гипотенузу 2. при равной гипотенузе бОльшая по сумме катетов Кстати интересно есть ли разные тройки с одинаковой гипотенузой. Если представить (5,7) и (7,9) как векторы на плоскости то мы можем их векторно умножить (формулу навскидку не скажу но она простая) и получить некую величину которая будет по смыслу площадью параллелограмма образованного этими векторами. Причем эта площадь будет иметь знак плюс или минус в зависимости от того "слева" или "справа" по отношению к первому вектору находился другой. Используя свойство знаковости для площади мы можем все множество "троек" сортировать или складывать в бинарные деревья. Тоесть у нас есть метод .compare() и .equal(). Если площадь равна нулю то векторы параллельны (коллинеарны) и мы нашли "подобный". Например вектор (3,4) и (6,8) коллинеарны. Образуют вырожденный треугольник или параллелограмм с нулевой площадью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 11:56 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
maytonDima Tкак сравнить не вычисляя 5/7 и 7/9 ? Если представить (5,7) и (7,9) как векторы на плоскости то мы можем их векторно умножить (формулу навскидку не скажу но она простая) не нравится мне "векторно умножить", какая бы не была простая формула - ее надо будет считать при каждом поиске неоднократно для сравнения двух элементов. Надо что-то что считать не надо, а только сравнивать. Ты же писал maytonВычислять его численно не нужно. Но эта дробь может участвовать в операциях поиска в рациональном представлении. вот я и подумал может есть какой чудо-алгоритм. Лично мне кажется что надо приводить тройку к примитивной (так это в мат.терминологии называется) с помощью простых чисел. И примитивные хранить, сравнивать и т.д. Перед сохранением приводить тройку к виду a <= b < c Пары (a,b) достаточно чтобы уникально идентифицировать тройку, сравнивать можно по алгоритму (a1,b1) < (a2,b2) если a1 < a2 или (a1 = a2 и b1 < b2) А дальше мне интересно есть различные тройки при одинаковом "а", т.е. можно ли использовать "а" как ключ. Тоже самое надо проверить на "с" Напишу проверку попозже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 16:07 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima Tmaytonпропущено... Если представить (5,7) и (7,9) как векторы на плоскости то мы можем их векторно умножить (формулу навскидку не скажу но она простая) не нравится мне "векторно умножить", какая бы не была простая формула - ее надо будет считать при каждом поиске неоднократно для сравнения двух элементов. Надо что-то что считать не надо, а только сравнивать. Ты же писал maytonВычислять его численно не нужно. Но эта дробь может участвовать в операциях поиска в рациональном представлении. вот я и подумал может есть какой чудо-алгоритм. Я над этим думаю. Можно хранить угловой коэффициент K или его обратное значение (котангенс альфа). Но поскольку мы играем по правилам алгебры больших целых чисел то нам не хватит разрядности double на очень больших значениях int64. Тоесть будут такие a1/b1 и a2/b2 различные и НЕ-подобные, но их угловой коэффициент будет одинаковый в представлении double. Основание простое - 52 бита мантиссы явно не хватит чтобы различать эту разницу. Когда это "стрельнет" - я не знаю. Надо посчитать. Возможно для 32х битных пифагоровых троек их хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 17:01 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima TА дальше мне интересно есть различные тройки при одинаковом "а", т.е. можно ли использовать "а" как ключ. Тоже самое надо проверить на "с" Оказалось есть повторы и a и с , и числа всего лишь двухзначные. Так что остается ключом использовать (a, b) На счет хранения a/b как double сомневаюсь, нехороший это тип для проверки равенства. Не для того он придуман. Может оказаться что для подобных треугольников он будет разный, достаточно чтоб не совпал младший разряд мантиссы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 22:04 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Вот формула расчёта (удвоенной) площади треугольника. Или параллелограмма. Код: plaintext 1. 2. 3. Где (x1,y1),(x2,y2),(x3,y3) координаты трёх вершин треугольника. Но для нашего случая где (x1,y1) всегда нулевые можно формулу упростить до такой. Код: plaintext 1. 2. 3. Проверяем (чортов Latex. Заколебал) . Для треугольников образованных векторами (5,7), (7,9) абсолютное значение площади можно посчитать интуитивно по следующей картинке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 22:23 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Проверим нашу целочисленную формулу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Итак механизм есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 22:36 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima TНа счет хранения a/b как double сомневаюсь, нехороший это тип для проверки равенства. Не для того он придуман. Может оказаться что для подобных треугольников он будет разный, достаточно чтоб не совпал младший разряд мантиссы. Его использование в контексте сравнения вида Код: plaintext 1. уже само по себе является антипаттерном. Так вещевтенные числа не сравнивают. Поэтому пролетит он, как напильник над Парижем. Хотя в другом контексте его использования как аппроксимацию чего-либо я-бы не был против. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2014, 22:40 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Еще одна очень простая формула. Просто сравниваем две дроби (угловые коэфф). Переносим влево и приводим к знаменателю И сравниваме результат. Больше нуля или меньше нуля - соотв. Гипотенуза с2 имеет наклон больше или меньше с1. Если равно нулю - то треугольники подобны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2014, 18:15 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
mayton И сравниваем результат. Знаменатель можно не считать По сути это ты уже предлагал выше mayton Только я не понимаю как это использовать, например в <map>. Что использовать в качестве ключа? Та же проблема будет с любой СУБД. А без ключа все алгоритмы быстрого поиска не работают, т.е. придется перебором сравнивать каждую новую с ранее найденными. Самый тормозной способ. Ключ должен быть производным от одной тройки, т.е. выражаться из (a,b,c). Если при этом для подобных троек он должен быть одинаковым, то тут только подходит, но это вещественное число, как вариант приводить к целому с округлением, но тут надо как-то вычислить погрешность округления, чтобы понять в какой момент округление начнет давать ошибки. Чем тебе не нравится мой вариант приведения тройки к примитивной с помощью простых чисел? По сути это поиск наибольшего общего делителя для всех трех чисел. Массив из 78,5 тыс простых чисел позволяет проверить любое число до триллиона (для типа unsigned int достаточно 6543 числа). Нехорошее место с извлечением корня можно заменить на другой алгоритм получения минимального целого больше корня. Думаю мой перебор простых чисел далеко не самый лучший, скорее всего существуют более продвинутые алгоритмы поиска наибольшего общего делителя. Вот 5 алгоритмов вообще без использования простых чисел. Потестю попозже какой быстрее. По моему лучше сначала привести к тройку к примитивной а затем ее хранить, тогда проблема поиска дублей решается классическими средствами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 08:45 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Тройка не нужна. Нам хватит двух катетов (a,b) для того чтобы установить "подобие". Рациональную дробь a/b придётся хранить в поисковой структуре в качестве ключа. И именно в таком виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 10:43 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
maytonНо для нашего случая где (x1,y1) всегда нулевые можно формулу упростить до такой. Код: plaintext 1. 2. 3. Упрощаем дальше: (- x3) * (y2 - y3) - (x2 - x3) * (- y3) = -x3*y2 + x3*y3 + x2*y3 - x3*y3 = x2*y3 - y2*x3 т.е. опять пришли к По поводу поиска НОД самым быстрым оказался уже использованный у тебя. Функция gcd(), сначала не понял чего это такое. Поправил код. Вот окончательный вариант с <map> для хранения результатов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. Для типа unsigned int можно запустить с параметром 46430 (больше нельзя, т.к. не лезет ii + jj) Этот код у меня отъедает 2 Гб оперативки под map и вылетает на Parse 65000000 Store 43332389 Time 148945 msec 65'000'000 это 10% от общего количества 655'264'541. Можно из найденного сделать вывод что треть это повторы, т.е. примитивных около 433'323'890. Можно прикинуть размер хранилища: минимум на запись 8 байт (а, b) = 4 Гб, это если использовать <vector> в который валить все результаты (а, b), периодически сортировать и выкидывать повторы. Для <map> тут надо 20 Гб оперативки (скорее всего поменьше, но не на много). Вывод: для типов больше 32х разрядов надо задействовать какую-нибудь серьезную СУБД. Бесплатный MS SQL Express с максимальным размером базы 10 Гб будет маловат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 13:39 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Я создал проект Пифагора на code.google.com. Если у тебя есть акк - то можно туда коммитить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 13:58 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Это конечно классно что ты задейстовал std::map но моя мысль заключалась в том чтобы в теле компаратора сравнивать не только на совпадение но и на больше-меньше. Тогда без факторизации можно пробежаться по дереву и найти либо место для вставки нового треугольника либо выдать ошибку типа "дубликат" ключа и игнорить вставку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 17:28 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
maytonЯ создал проект Пифагора на code.google.com. Если у тебя есть акк - то можно туда коммитить. Нет аккаунта, да и с английским все плохо. Да и тема исчерпана уже. Проверил на пропуски Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. Твой код генерит почти непрерывную последовательность примитивных троек. При a < 40`000 и b < 40`000 всего 7`150 примитивных троек, он находит их все перебрав 14`501 (параметр 219 при запуске). то же самое подтверждают запуски с ограничением b по значению в StoreTri() (параметр 46400 при запуске) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. В какой-то момент наступает максимум найденных троек и он больше не меняется. В итого: для продолжения надо заменить тип на 64-бита и привязать какую-то взрослую СУБД для хранения результата. PS Непонятно какой практический смысл в этой генерации? Пытался придумать - не смог. Поисковики выдают только то что это было нужно при строительстве египетских пирамид несколько тысяч лет назад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 20:24 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
PPS Было интересно отвлечься от постоянных +-*/ в рублях и штуках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 20:44 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima TPS Непонятно какой практический смысл в этой генерации? Пытался придумать - не смог. Поисковики выдают только то что это было нужно при строительстве египетских пирамид несколько тысяч лет назад. А никакого смысла брадт. Считай что это просто пятничная задачка. Я просто скажу тебе следующее. Попытка разложить на множители следующее привела к возникновению комплексных чисел. Попытка исследовать глубоко теорему Ферма - много лет давала туеву хучу побочных теорем, лемм и гипотез. Зачем вообще искать практический смысл в проблемах Гильберта? А низачем. Это игры разума! Добро пожаловать в математику! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 22:04 |
|
||
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#18+
Dima TВ какой-то момент наступает максимум найденных троек и он больше не меняется. Кстати если ты в состоянии объяснить этот эффект - то ты понял ограничения разрядной сетки и самое главное почему и где и как его устранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 22:06 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019754]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 306ms |
| total: | 483ms |

| 0 / 0 |
