Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Новогодний мега-мозг
|
|||
|---|---|---|---|
|
#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?fid=57&msg=38532462&tid=2019754]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 331ms |
| total: | 491ms |

| 0 / 0 |
