Допомога - Пошук - Користувачі - Календар
Perfect Cuboid
Розподілені обчислення в Україні | Распределенные вычисления в Украине > Українські проекти розподілених обчислень > Інші українські проекти
1, 2, 3
x3mEn


Раціональний кубоїд (або цілочисельна цеглина, або ідеальний кубоїд) — прямокутний паралелепіпед,
у якого всі сім основних величин (три ребра, три лицьових діагоналі і просторова діагональ) є цілими числами, є однією з відкритих математичних проблем
Інакше кажучи, раціональний кубоїд — цілочисельне рішення системи діофантових рівнянь.

Досі невідомо, чи існує такий паралелепіпед. Комп'ютерний перебір не знайшов жодної цілочисельної цеглини з ребрами до 10^11.
Втім, знайдено кілька «майже цілочисельних» паралелепіпедів, у яких цілочисельними є всі величини, крім однієї:
— одна з лицевих діагоналей не ціле число.
, — одне з ребер не ціле число.
Велика кількість паралелепіпедів Ейлера (з нецілою просторовою діагоналлю, див. нижче).
Косокутні паралелепіпеди, у яких всі сім величин цілі. При цьому досить одного непрямого кута.
У 2005 році тбіліський студент Лаша Маргішвілі запропонував доведення, що цілочисельний кубоід не існує — однак на 2009 рік робота так і не пройшла перевірку незалежними вченими.

Паралелепіпед Ейлера
Прямокутний паралелепіпед, у якого цілочисельні тільки ребра і лицьові діагоналі, називається ейлеровим.
Найменший з паралелепіпедів Ейлера — (240, 117, 44), з лицьовими діагоналями 267, 244 і 125.
Ще кілька паралелепіпедів Ейлера:
(275, 252, 240),
(693, 480, 140),
(720, 132, 85),
(792, 231, 160).
Ейлер описав два сімейства таких паралелепіпедів (звідси назва). Втім, повного опису всіх паралелепіпедів Ейлера також немає.
Відомі такі вимоги до ейлерового паралелепіпеда (а значить, і до цілочисельної цеглини):
- Одне ребро ділиться на 4, друге ділиться на 16, третє непарне (якщо, звичайно, він примітивний — тобто, НСД (a, b, c) = 1).
- Одне ребро ділиться на 3 і ще одне — на 9.
- Одне ребро ділиться на 5.
- Одне ребро ділиться на 11.
- Одне ребро ділиться на 19.
- Одне ребро або просторова діагональ діляться на 13.
- Одне ребро, лицьова або просторова діагональ діляться на 17.
- Одне ребро, лицьова або просторова діагональ діляться на 29.
- Одне ребро, лицьова або просторова діагональ діляться на 37.
- Добуток ребер, лицьових і просторової діагоналі має ділитися на 2^8·3^4·5^3·7·11·13·17·19·29·37
Rilian
я эту задачу уже рассматривал, не зря тестовый боинк висел у нас на поддомене cuboid smile.gif)

потом почитал новости по теме, там уже перебрали немеряное кол-во чисел, и для больших ничего не нашли
x3mEn
Є одна дуже цікава задача мого дитинства - задача про "цілочисельний паралепіпед".
Прямокутний паралепіпед, в якого є 7 невідомих:
3 ребра, 3 його лицьові діагоналі, 1 просторова діагональ.
Задача полягає, чи існує такий паралепіпед, в якого всі 7 вказаних змінних є цілими числами?
Задача еквівалента вирішенню системи діафантових рівнянь:
a2+b2=d2
a2+c2=e2
b2+c2=f2
b2+e2=g2
Станом на 1988 задача не була вирішена, як і не було доведено, що рішення не існує.

Пропоную організувати прямий розумний перебір.
Беремо 3 натуральних числа a, b и c, такі, що
a < b < c,
a+1 <= b <= (a^2-4)/4,
b+1 < с <= (a^2-1)/2
Для кожного а організовуємо 2 вкладені цикли:

for b = (a + 1) to int((a^2 - 4)/4)
if checkab(a, b) <> 0 then
d = checkz(a, b)
if d <> 0 then
for c = (b + 1) to int((a^2 - 1)/2)
if checkabc(a, b, c) <> 0 then
e = checkz(a, c)
if e <> 0 then
f = checkz(b, c)
if f <>0 then
g = checkz(b, e)
if g <> 0 then addresult(a, b, c, d, e, f, g)
endif
endif
endif
endif
endfor
endif
endif
endfor


В функції checkab(a, b) перевіряємо, що a і b не є одночасно непарними.

В функції checkabc(a, b, c) перевіряємо, що:
1. серед a, b і c тільки одне число непарне.
2. одне з чисел ділить на 4, а одне з інших - на 16
3. одне з чисел ділить на 3, а одне з інших - на 9
4. одне з чисел ділить на 5
5. одне з чисел ділить на 7
6. одне з чисел ділить на 9
7. одне з чисел ділить на 11
8. одне з чисел ділить на 19

В функції checkz(x, y) перевіряємо, чи існує натуральне z, таке, що
x2+y2=z2. Якщо не існує, повертаємо 0. Існує - звісно повертаємо z.

Тут є декілька думок:
Перша - перевірка останньої цифри суми квадратів.
Оскільки остання цифра квадрату може бути:
1 - 1
2 - 4
3 - 9
4 - 6
5 - 5
6 - 6
7 - 9
8 - 4
9 - 1
0 - 0
Отже квадрат може закінчуватись тільки на (0, 1, 4, 5, 6, 9), а сума квадратів може приймати значення з імовірностями:
0 - 16,67%
1 - 11,11%
2 - 5,56%
3 - 5,56%
4 - 11,11%
5 - 16,67%
6 - 11,11%
7 - 5,56%
8 - 5,56%
9 - 11,11%
Отже, ще до будь-яких піднесень до квадратів можна одразу відкинути 2/9 всіх пар чисел.
Ще один випадок, що можна швиденько відкинути: якщо остання цифра суми квадратів закінчується на 0, шуканий квадрат має закінчуватись на 00.
Задля цієї перевірки достатньо перевірити:
k = x rem 100
l = y rem 100
тобто k і l - числа, складені з двох останніх цифр x та y відповідно.
Тоді треба перевірити, що
(k^2 + 2k + l^2 + 2l) rem 100 = 0

Ну а далі треба шукати швидкі методи пошуку натуральних коренів.

Поки що все.

P.S.: Процедура addresult() зберігає результат і виплачує премію в 1000 дол. smile.gif

P.P.S.: Почитав пости назад у часі... ідея з пошуком "ідеального кубоіда" вже була, тільки що brute force без особливих оптимізацій.
Тому вибачаюсь за повтор. Витирати посилання не буду, оскільки приклав багато зусиль, щоб все викласти, що в голові було.

P.P.P.S: якщо є обчислювальні обмеження з точним обрахунком квадрату числа (можу припустити, що так воно і є), можу запропонувати організацію вкладених циклів в оберненому порядку від більшого числа до меншого.
Тобто спочатку фіксуємо найбільше з ребер c, потім організовуємо цикл вниз від (с-1) до int(sqrt(4c+4)) для числа b, ну а потім цикл вниз від (b-1) до int(sqrt(2c+1)) для найменшого з ребер a.
Ну а все інше - як викладено вище.

На вхід подається 2 числа, m і n:
m <= c <= n

for c = m to n
for b = (с - 1) downto int(sqrt(4c + 4))
if checkab(b, c) <> 0 then
f = checkz(b, c)
if f <> 0 then
for a = (b - 1) downto int(sqrt(2c+1))
if checkabc(a, b, c) <> 0 then
d = checkz(a, b)
if d <> 0 then
e = checkz(a, c)
if e <>0 then
g = checkz(b, e)
if g <> 0 then addresult(a, b, c, d, e, f, g)
endif
endif
endif
endif
endfor
endif
endif
endfor
endfor

Числа m і n визначають, як вся задача розрізається на окремі завдання.

Вартість завдання можна визначати, наприклад:
1. за кількістю заходів в checkz
2. за кількістю нетривіальних перевірок в середині checkz (алгоритм якої ще треба придумати).
3. за кількістю заходів в checkab
4. за кількістю заходів в checkabc
Всі 4 числа мають різну вагу, тому що складність виконання різна.

Валідність розрахунку можна визначати теж за цим показником.

(Rilian @ Aug 6 2010, 01:47) *

я эту задачу уже рассматривал, не зря тестовый боинк висел у нас на поддомене cuboid smile.gif)

потом почитал новости по теме, там уже перебрали немеряное кол-во чисел, и для больших ничего не нашли


А в мене з дитинства залишилась віра, що, якшо знайшли майже ідеальний паралелепіпед (6 з 7 - натуральні),
то має бути і повністю ідеальний цеглоїд. smile.gif Всі 7 величин! 7 - це Боже число. Як знайдемо, то кінець світу настане! smile.gif
x3mEn
Ситуація така: я задачу не залишив, за останній місяць перечитав достатньо багато літератури з тематики "ідеального кубоїда"
і врешті написав на Delphi 7 LE тестову програму.
Ось основна література, на якій базується мій "розумний" перебір:
29 гипотеза Альшина
Суммы квадратов и целые гауссовы числа

На Вікіпедії вказано, що якщо такий кубоїд існує, найменше ребро має бути більшим за 100млн.
100млн. - це, очевидь, обмеження 32-біт.
Тому задача дуже амбітна: перебрати всі підходящі просторові діагоналі для всіх 64-бітних цілих чисел і або таки знайти кубоїд, або довести, що його не існує і серед 64-бітних цілих чисел.
Реально це, чи ні - ви самі можете оцінити, виходячи із швидкості перебору на одному ядрі CPU (див. вклад.)
Алгоритм пошуку дуже відрізняється від того, що я описав навіть місяць назад.
Якщо коротко: я перейшов від перебору ребер до перебору просторових діагоналей.
Просторова діагональ може бути тільки числом, що розкладається на прості числа виду 4k+1.

Наступна задача - написати GPU-аналог.
Виходячи з того, яка швидкість перебору з використанням cuda-клієнта для Collatz Conjecture,
мені здається, що на GPU подібні перебори набагато ефективніше працюватимуть.
Якщо є специ, що мають досвід роботи з CUDA SDK, відгукніться, будь ласка.
molo
Дякую, x3mEn
Хороша робота!

Тільки ще би маленького мануала для усіх smile.gif

Щодо GPU версії, то звичайно потрібно, але почати можна би було і зі звичайної CPU версії для Windows OS. Потім неодмінно покрити інші.

Клієнтська частина виглядає не дуже складною (простий перебір, щоб 100% перевірити) + комунікація з серверною частиною (відсилка результатів, отримання задачі, оновлення клієнта) - для початку, здається досить.

Я так, розумію, питання щодо серверної частини досі відкрите - чи будемо використовувати Boinc чи інший аналог (точно і не знаю чи щось нове з'явилось).Іншим варіантом є розробка своєї серверної частини (Java або .NET, maybe PHP + database MySQL).

Чим раніше ми би випустили робочу версію (клієнт-сервер + реєстрація користувачів + статистика) тим потенційно більше би людей ми могли б найти для проекту. Бо більшість серйозних людей навіть не звернуть увагу, коли у нас крім балачок нічого ще нема.

Як тільки буде визначено з серверною частиною, то, гадаю, ми могли б шукати бажаючих допомогти і формувати активну частину проекту (внутрішні обговорення, SVN, wiki, TODOs etc.)
x3mEn
(molo @ Aug 30 2010, 08:06) *

Дякую, x3mEn
Хороша робота!

Тільки ще би маленького мануала для усіх smile.gif


Мануал до тестової програми?

Ну, по-перше перебір ведеться серед діагоналей, що утворюються різними комбінаціями добутків простих чисел виду 4k+1 у різних ступенях.
У віконці Current position можна побачити поточну позицію перебору. У таблиці - фактори і їх ступені, в полі Diagonal - відповідне значення діагоналі.
Squares - кількість різних розкладань числа Diagonal на суму двох квадратів.
До речі, перевірити розкладання можна, якщо поставити галочку Save squares to .txt files, тоді в директорії, звідки зпускалась програма, будуть створюватись файли з назвою = значенню Diagonal, а всередині через кому будуть перелічені всі пари розкладів.
Кількість розкладів можна розрахувати за відомою формулою.
Власне, я дуже втішаюсь, що кількість розкладів, що я отримую за алгоритмом, збігається із значенням за формулою.
Наприклад:
5**7
13**1
17**2
29**2
37**2
41**1
53**1
Тобто діагональ = 734328519856953125
Кількість розкладів: [((2*7+1)(2*1+1)(2*2+1)(2*2+1)(2*2+1)(2*1+1)(2*1+1)+1)/2] = [(15*3*5*5*5*3*3+1)/2] = 25313

Для кожної діагоналі на основі її розкладу на суму квадратів відбувається пошук усіх інших 6 вимірів (3 ребра, 3 лицьові діагоналі).
Розділ Last Checked Candidate власне створений для того, щоб візулізувати пошук.
Для кожної діагоналі кількість переборів має порядок Q^2, де Q - кількість розкладів.
У найгіршому випадку = (Q^2)/2, у найкращому - 0. smile.gif
Власне, це найкращий порядок, якого я досяг. За рахунок певних оптимізацій, таких як, наприклад:
- попередня перевірка, що 2 ребра не можуть бути одночасно непарними числами,
- для обраної лицьової діагоналі F перебір одного з ребер тільки до значення sqrt(F) і таке інше
кількість переборів ще скорочується, може десь в 2-3 рази.

Settings: встановлення початкової і кінцевої позицій перебору.
Manual - вручну, інакше - з файлу.
Метод вручну обмежується встановленням одного значення фактору і його ступеню.
Через файл початкову і кінцеву позицію можна встановити точніше.
У будь-якому випадку під час обрахунку у файлі зберігається остання позиція.
Власне, за змовченням встановлено метод "Через файл", разом з exe я додав task64.txt з останною позицією, до якої я дорахував на той момент.
Якщо обрати метод Manual, тоді файл буде створено самостійно, пізніше за великого бажання можна самостійно змінити початкові і кінцеві позиції через будь-який текстовий редактор.
Параметр "кінцева позиція" є необов'язковим, якщо спочатку не вказано, перебір буде тривати, поки не перебере все до кінця. smile.gif
Refresh Frequence (sec) я створив для того випадку, якщо перебір відбувається вже надто швидко і візуалізація гальмує сам перебір.
Це було корисно, наприклад, коли я створив версію програми, що відтворює пошук лише серед 32 бітних цілих. Тоді перебір відбувається аж надто швидко.
Якщо цікаво, можу скомпілювати 32 бітну версію і викласти сюди. В мене є враження, що 32-бітний перебір взагалі можна зробити силами однієї машини.
В мене, правда, є певні сумніви щодо швидкості пошуку простих чисел у високих діапазонах чисел, можливо це свого часу стане серйозним гальмом.
Але, принаймні за пігодинки в 32-бітній версії я перебрав всі варіанти факторів аж десь до 70000. Для 32 біт переломним є число 46000, після чого кількість варіантів розкладів тільки падає.
А основне гальмо в цьому переборі це не абсолютне значення діагоналі, а кількість розкладів цього числа на суми квадратів.

В розділі Statistics показується загальна статистика процесу від початку запуску.
Найцікавішими є такі значення:
Diagonals checked - кількість перебраних діагоналей
Avg Time per G (sec) - середня тривалість перевірки однієї діагоналі
Avg Squares per G - середня кількість розкладів діагоналі на суму двох квадратів
x3mEn
Нова версія тестової програми.

Зміни:
+ Нова статистика, підраховується кількість циклів, ASPG / AGPS - Average seconds per G (diagonal) / Average G (diagonals) per second
+ Змінено формат збереження тестових завдань, тепер у вигляді Ini файла. За рахунок цього дискові опреації відбуваються за таймером.
+ Додано збереження проміжного результату статистики (дата початку, тривалість, кількість оброблених діагоналей та ін.)
+ Пофіксені баги, які могли б "вістрилити" на числах більших за 32 біти
+ Додано кнопку Reset, аби можна було перервати виконання з обнуленням всіх даних
+ Змінено логіку визначення кінця завдання. Тепер, якщо вказано, що Finish position, припустимо, 53**1, це значить, що 53**1 буде останнім числом завдання

У самому алгоритмі, нажаль, ніяких змін не відбулося. sad.gif
Останнім часом не можу придумати, як ще можна було б зменшити кількість переборів.

Вибачте, що викладаю ехе-шник. По-перше не у всіх є Delphi, щоб відкомпілювати, а по-друге, сам алгоритм певним чином складає для мене певну цінність.
Я поділюся сорсами тільки якщо знайду того, хто допоможе написати або GPU аналог, або клієнта і сервер, нехай навіть для CPU.
molo
Привіт Усім!

Дякуючи хорошим ідеям про ‘наш проект’ - раді повідомити, про початок розробки проекту по пошуку ідеального паралелепіпеда - http://perfectcuboid.com/

Якщо є бажання і час - ласкаво просимо до проекту. Роботи вистачить на усіх smile.gif

Короткий список активностей:
1. Розробка/обговорення алгоритму обчислення
2. Тестування
3. Веб дизайн
4. Адмінування
5. Підтримка сайту
6. Розробка клієнтської частини
7. Розробка серверної частини
8. …

Контакти:
http://perfectcuboid.com/contact-us
team@perfectcuboid.com

Першочергові кроки:
1. Початкова інфраструктура серверної частини – в процесі
2. Фіналізувати початковий API для комунікації серверної і клієнтської частини – в процесі
3. Розробка клієнтської частини для Windows

Якщо адміністрація distributed.org.ua дозволить – раді продовжити обговорення в даній темі, або новоствореній темі.
re_SET
molo, Насколько сложная задача в плане выч. мощностей?
molo
(re_SET @ Jan 28 2011, 10:02) *

molo, Насколько сложная задача в плане выч. мощностей?


Хороше питання, re_SET!

Передусім об’єм обрахунків буде залежати лід алгоритму. x3mEn уже зробив певні дослідження в цьому напрямку.

Пригадую я вже робив заміри на десктопному процесорі (див. вище по темі)
Повторивши результати:

1.6GHz processor - 1 ядро (laptop)
10^9 комбінацій ~ 5хв – простий перебір

Щоб обрахувати кубоід з 10^6 ( 1-1,000,000):
10^6 * 10^6 * 10^6 = 10^18 комбінацій
10^18 комбінацій / (10^9 комб/5хв) = 10^9 циклів по 5хв = 5*10^9 хв = 83,333,333 год = 3,472,222 доби = 9,512 роки

Переведемо на 1GHz:

Щоб обрахувати кубоід з 10^6 на 1GHz (10^18 комбінацій):
9,512 * 1.6 = 15,219 роки


Щоб обрахувати кубоід з 10^11 на 1GHz (10^33 комбінацій) - повторити теперішні обрахунки:
10^33 / 10^18 = 10^15 циклів по 15,219 роки
10^15 * 15,219 роки ~ 15 * 10^15 років

Так як навіть зараз процесори мають більші потужності ~ 2*2.5 = 5GHz. Не кажучи про 6-ти ядерні від AMD – 3.5GHz * 6core = 21GHz. Тому з часом швидкість обрахунків буде тільки зростати в рази.

Основною складовою буде, як завжди, в розподільних обчисленнях, буде кількість учасників.

Виглядає досить амбітно і довготривало.
Rilian
molo, мне кажется я видел в интернете инфу что какие-то китайцы вычислили до 10^18 все кубоиды и идеального не нашли...
molo
(Rilian @ Jan 28 2011, 12:43) *

molo, мне кажется я видел в интернете инфу что какие-то китайцы вычислили до 10^18 все кубоиды и идеального не нашли...


Тоді хочеться вірити, що початкові підрахунки в мільярди років не зовсім вірні і ми зможемо обрахувати все значно швидше smile.gif

Основна ідея проекту - відкритість результатів, доступних 24/7. Отже кожен зможе слідкувати за статусом.
x3mEn
(molo @ Jan 28 2011, 11:41) *

(re_SET @ Jan 28 2011, 10:02) *

molo, Насколько сложная задача в плане выч. мощностей?

Щоб обрахувати кубоід з 10^6 ( 1-1,000,000):
10^6 * 10^6 * 10^6 = 10^18 комбінацій
10^18 комбінацій / (10^9 комб/5хв) = 10^9 циклів по 5хв = 5*10^9 хв = 83,333,333 год = 3,472,222 доби = 9,512 роки


В дійсності і кількість варіантів і оцінка тривалості зовсім інші.
За моїм алгоритмов задля того, щоб підрахувати кількість варіантів, які треба перебрати, треба зробити наступне:
1) знайти всі прості числа виду 4k+1 в діапазоні від 5 до (2^64)/(5^2) (якщо треба, можу пояснити, чому саме до цього числа)
2) із всіх цих простих чисел утворити всі їх комбінації такі, що П p(i)^k(p) < 2^64, де p(i) - просте число, k(p) - ступінь, до якої підноситься це просте число.

Це ми отримаємо кількість всіх діагоналей-кандидатів.
Діагональ-кандидат дорівнює, відповідно П p(i)^k(p)
Потім для кожної діагоналі треба знайти всі розклади на суму квадратів.
Кількість таких розкладів вираховується за формулою П (k(p)+1)
Час перевірки однієї діагоналі залежить від кількості різних розкладів приблизно у кубічній залежності.

Так от щоб хоча б приблизно підрахувати час повного перебору, це треба вирахувати суму кубів по всім діагоналям-кандидатам і поділити на середню швидкість перебору кандидатів.

Хто візьметься зробити хоча б пункт #1, порахувати кількість простих чисел виду 4k+1 в діапазоні від 5 до (2^64)(5^2) ? icon_trollface.png
Щоб зрозуміти, цю всю масу простих чисел реально зібрати на одній машині для нарізки завдань, чи для цього ще треба буде організувати підпроект?
molo
(x3mEn @ Jan 28 2011, 19:31) *



Хто візьметься зробити хоча б пункт #1, порахувати кількість простих чисел виду 4k+1 в діапазоні від 5 до (2^64)/5/13 ? icon_trollface.png
Щоб зрозуміти, цю всю масу простих чисел реально зібрати на одній машині для нарізки завдань, чи для цього ще треба буде організувати підпроект?


Це може бути першою стадією того ж проекту.

З іншого боку підбір діагоналей може бути здійнений на тому ж клієнті.
Для прикладу - пакет 100k-200k

спочатку клієнт перебирає діагоналі в заданому діапазоні, а потім веде розрахунки по вибраним діагонаям.
x3mEn
Саме так і працює моя програма.
Поясню на прикладі, як відбувається перебір діагоналей.

Перші члени послідовності простих чисел виду 4k+1 наступні:
5, 13, 17, 29, 37, 41...
Беремо перший елемент 5. Це і є перша діагональ.
Друга діагональ - це 5^2, третя - 5^3 і т.д. аж до 5^27 (5^28 вже більше 2^64)
Тепер ступінь 5 обнулюємо, беремо наступне просте - 13. Це наступна діагональ.
Наступна діагональ - 13*5, наступна - 13*5^2 і т.д. аж до 13*5^25.
Далі беремо 13^2 і утворюємо діагональ добутком з усіма ступенями 5, аж до (13^2)*(5^24).

Ну, я думаю зрозуміло.

Проблема полягає тільки у тому, що набір простих чисел виду 4k+1 заздалагідь невідомий і треба вирішити, чи то спочатку організувати пошук простих виду 4k+1, сформувати базу, а потім у завданні для клієнта просто віддавати набори простих чисел, які треба комбінаторно перебрати, аби не змушувати шукати прості числа числа. Чи то залишити за клієнтом задачу пошуку простих чисел виду 4k+1 у заданому діапазоні.

Я особисто схильний до того, щоб клієнти не займалися пошуками простих чисел, а лише перебирали всі їх комбінації.
Як показує моя практика, якщо вже є якийсь, назвемо базовий набір простих, чисел, наприклад (73, 53^2), то для клієнта буде достатньо роботи, аби утворити і перевірити всі комбінації простих чисел виду 4k+1 із множини (5, 13, 17, 29, 37, 41) у всіх різноманітних їх ступенях у комбінації з базовим набором, так, що їх загальний добуток менший за 2^64.

Тому я пропоную завдання для клієнта формувати наступним чином:
(базовий набір) ; (динамічний набір).
Так, наприклад завдання виду
(53^2, 73) ; (5, 13, 17, 29, 37, 41) буде означати, що треба перебрати всі комбінації діагоналей, утворених добутком елементів базового набору (53^2, 73) з усіма можливими комбінаціями елементів динамічного набору (5, 13, 17, 29, 37, 41) в усіх можливих ступенях, таких, що загальний добуток менший за 2^64
За такої постановки задачі клієнти не будуть витрачати час на пошук простих чисел.
Звичайно, що знайти наступне просте число виду 4k+1 не є великою проблемою для клієнта, якщо 4k+1, скажімо, менше за 1 000 000, але 1 000 000 - це тільки 2^20, а що робити, коли просте число буде порядку 2^50 і треба буде знайти наступне просте число? Клієнт вимушений буде витратити годину часу, аби тільки знайти, перевірити на простоту і, між іншим, лише задля того, щоб утворити з ним умовно кажучи пару-трійку комбінацій і впевнитись, що вони не утворюють Ідеального кубоїда. Дуже не ефективне використання ресурсів.

Розмір динамічного діапазону залижить від елементів базового набору. Чим добуток елементів базового набору менший, тим менший має бути набір динамічного набору, адже за маленького добутку елементів базового набору ступенів свободи для динамічного набору більше. І навпаки. коли базовий набір буде рости і наближатися до 2^64, тим менше ступенів свободи у динамічного набору, а значить менша кількість діагоналей які треба перебрати, а отже, щоб завдання не було зовсім коротким, базовий набір для одного завдання буде складатися з великого за кількістю елементів базового набору великих простих чисел виду 4k+1.

Ну, я сподіваюсь ви не позасинали, поки дочитали до звідси. smile.gif
В дійсності в цьомі проекті буде дуже багато математики, комбінаторики, теорії чисел і таке інше, тому звикайте smile.gif
Або не читайте і віддайте на потану тим, кому це цікаво. smile.gif
Death
список простых чисел примерно до миллиарда давно известен.
проверить их на форму 4к+1 - 10 минут.

надо просто этот список нагуглить. ещё 2 минуты.

быстрее

Welcome to Prime-Numbers.org. This website provides entire small prime numbers list. You can browse all small prime numbers(small than 10000000000) here. ...
www.prime-numbers.org/

олсо

The Goldbach conjecture verification project reports that it has computed all primes below 1018.[1] That means 24,739,954,287,740,860 primes, but they were not stored. There are known formulas to evaluate the prime-counting function (the number of primes below a given value) faster than computing the primes. This has been used to compute that there are 1,925,320,391,606,803,968,923 primes (roughly 2×10^21) below 10^23.
x3mEn
Я сподіваюсь, що після усього мною сказаного зрозуміло, що цей проект має дуже багато спільного з PrimeGrid. Я, до речі, намагався налагодити контакти з ідейним керівником PrimeGrid. Його зацікавила моя ідея, але не більше. Власне через те, що їх метою є пошук простих чисел, а моєю - використання бази простих чисел для власного субпроекту, я думаю, наша переписка далі балачок не просунулась.
Власне, якщо б мати базу всіх простих чисел до (2^64)/(5^2), можна було б зайнятися прогою для нарізки завдань.
Дійсно, спочатку треба дізнатися, скільки така база буде важити.
Я сподіваюсь, що не більше пари гіг
Якщо б так, можна було б спробувати порахувати, скільки завдань треба буде нарізати, ну і скільки це загалом триватиме.
x3mEn
(Death @ Jan 28 2011, 22:59) *

roughly 2х10^21 below 10^23

(2^64)/(5^2) = ~ 7.3*10^18
Якщо в загальній масі простих чисел приблизно 2%, а нас цікавлять виду 4k+1, тобто десь половина, отже це 1% від 7.3*10^18, тобто десь 7.3*10^16
Для зберігання одного числа все одно треба буде виділяти 64 біта, получається, що всього для зберігання база має бути 7.3*10^16 * 8 байт = 56'294Тб.
Мда, трохи забагато...

Я здається ніде не помилився в розрахунках?
Навіть якщо замість 64 біт використовувати якийсь тип із динамічним виділенням розміру, все одно багато виходить...
x3mEn
До речі, простих чисел менших за 2^32 якщо теж близько 2%, для того, щоб їх всіх зберігати треба лише щось близько 350Мб,
а для 2^48 - 858Гб. Якщо подумати, не так вже і багато. molo, може для початку спробувати сили в діапазоні до 2^48?
Death
не, там дальше их количество уменьшается.
пи(х) нелинейно.
x3mEn
(Death @ Jan 29 2011, 00:00) *

не, там дальше их количество уменьшается.
пи(х) нелинейно.

На 10 млрд - 4.55%, на 10^23 - 2%
від цього нічого особливо не міняється.
ну, на 2^48 буде не 900Гб, а 2Тб.
Подумаєш, терабайт туда, терабайт сюда... smile.gif
A1ex01
пока разобрал шо на рисунке blink.gif
перерисовал по своему



зы: добавил dab, dac
x3mEn
A1ex01,
так зрозуміліше.
тільки я б діагоналі назвав по іншому.
Адже загалом задача зводиться до вирішення системи діафантових рівнянь
a^2 + b^2 = d^2
a^2 + c^2 = e^2
b^2 + c^2 = f^2
a^2 + f^2 = g^2
Хоча, звичайно, якими саме літерами назвати грані і діагоналі, немає особливого значення.
x3mEn
Я переспав з цією проблемою, де зберігати прості числа і прийшов до такої думки:
якщо мета - перебрати всі діагоналі в діапазоні до 2^64, а діагональ утворюється добутком простих чисел, то достатньо отримати базу простих чисел в діапазоні від 2 до 2^32, адже будь-які діагоналі, що утворюються добутком, в якому присутнє просте число, більше за 2^32, не може містити іншого простого числа, більшого за 2^32. Отже для формування завдань з використанням простих чисел, більших за 2^32, достатньо буде тримати базу простих чисел від 2 до 2^32, а в діапазоні від 2^32 до 2^64 організувати вікно, що буде рухатись вгору по мірі виконання завдань.
Таким чином прості числа в діапазоні від 2^32 до 2^64 будуть шукати окремим підпроектом і немає необхідності їх десь зберігати.
Єдине що, одним з бонусів підпроекту має бути оголошення всіх знайдених простих чисел в діапазоні від 2^32 до 2^64 на окремий сервіс, який займається збиранням простих чисел, наприклад у той самий www.prime-numbers.org, якщо в них оголошення простих чисел передбачено...
re_SET
(x3mEn @ Jan 29 2011, 10:44) *

Я переспав з цією проблемою, де зберігати прості числа і прийшов до такої думки:
якщо мета - перебрати всі діагоналі в діапазоні до 2^64, а діагональ утворюється добутком простих чисел, то достатньо отримати базу простих чисел в діапазоні від 2 до 2^32, адже будь-які діагоналі, що утворюються добутком, в якому присутнє просте число, більше за 2^32, не може містити іншого простого числа, більшого за 2^32. Отже для формування завдань з використанням простих чисел, більших за 2^32, достатньо буде тримати базу простих чисел від 2 до 2^32, а в діапазоні від 2^32 до 2^64 організувати вікно, що буде рухатись вгору по мірі виконання завдань.
Таким чином прості числа в діапазоні від 2^32 до 2^64 будуть шукати окремим підпроектом і немає необхідності їх десь зберігати.
Єдине що, одним з бонусів підпроекту має бути оголошення всіх знайдених простих чисел в діапазоні від 2^32 до 2^64 на окремий сервіс, який займається збиранням простих чисел, наприклад у той самий www.prime-numbers.org, якщо в них оголошення простих чисел передбачено...

cool2.gif
A1ex01
(x3mEn @ Aug 28 2010, 19:44) *


Просторова діагональ може бути тільки числом, що розкладається на прості числа виду 4k+1.


напиши почему так, а то ссылки твои здохли
по 29 гипотеза Альошина -нагуглил:
"29. Целочисленного параллепипеда не существует (Разраб.)"

простые числа на прайме:
http://www.primegrid.com/torrent/

http://www.primegrid.com/download/primes_iso/
x3mEn
A1ex01,
я збирався це зробити.
основний дуже важливий документ, з якого я зробив цей висновок, доступний за адресою
http://kvant.mirror1.mccme.ru/pdf/1999/03/kv0399senderov.pdf

Доведення буде складатися з деяких частин.
Нажаль треба багато часу, щоб навести його тут цілком, тому почну з початку:

Теорема 1.
Всякое нечётное число, представимое в виде суммы квадратов двух целых чисел при делении на 4 даёт остаток 1, а не 3.
Доказательство:
Из двух квадратов, сумма которых нечетна, обязательно один четен, а другой нечетен.
Квадрат четного числа нацело делится на 4, а квадрат нечетного числа при делении на 4 даёт остаток 1.

Теорема 2.
Любое простое число p, которое при делении на 4 даёт остаток 1, представимо в виде суммы квадратов двух натуральных чисел.
Доказательство состоит из двух лемм:
Лемма 1.
Для любого простого числа p = 4k+1, где k - натуральное, существует такое целое число m, что m^2+1 кратно p.
Лемма 2.
Любой простой делитель p числа m^2+1, где m - целое, представим в виде суммы квадратов двух натуральных чисел.

Из Теорем 1 и 2 следует, что простое число p>2 не представимо в виде суммы двух квадратов, если оно имеет вид 4k+3, и представимо, если p = 4k+1

Критерий Жирара.
Натуральное число представимо в виде суммы квадратов двух целых чисел тогда и только тогда, когда в его разложении на простые множители любой простой множитель вида 4k+3 входит в чётной степени.
A1ex01
теорема 1 понятна и так, особенно в двоичной системе

теорема 2 о простых числах, почему диагональ всегда простое число?
по моему это частный случай, т.е. если диагональ простое -тогда твоя формула...
molo
(A1ex01 @ Jan 29 2011, 22:01) *


Djakuju, A1ex01

Vygljadaje, scho po torrentu nihto ne rozdaje.
Ale prjami linky pracjujut' - probuju vykachaty i pidnjaty. Nevpevnenyj scho tam - bachu obrazy DVD, ale scho v seredyni...

Htos' mozhlyvo zustrichav dazu/spysok - Euler brick (Прямоугольный параллелепипед, у которого целочисленные только рёбра и лицевые диагонали, называется эйлеровым. )? To by moglo pomogty na pershyh stadijah rozrahunkiv, a takozh dlja perevirky pravyl'nosti nashyh teorij.
x3mEn
A1ex01,
якраз збирався написати другу частину.

Загальна формула для представлення добутку суми двох квадратів у вигляді суми двох квадратів наступна:
(a^2+b^2)(x^2+y^2) = a^2*x^2 + a^2*y^2 + b^2*x^2 + b^2*y^2,
додамо і віднімемо 2axby:
(a^2+b^2)(x^2+y^2) = a^2*x^2 + 2axby + b^2*y^2 + a^2*y^2 - 2axby + b^2*x^2 = (ax + by)^2 + (bx - ay)^2 (1)
Запам'ятаємо цю формулу, вона нам ще дуже знадобиться.

а) Якщо число n є сумою двох квадратів, то і число 2n представляється у вигляді суми двох квадратів.
Доведення:
Якщо n = x^2 + y^2, то
(x+y)^2 + (x-y)^2 = x^2 + 2xy + y^2 + x^2 - 2xy + y^2 = 2x^2 + 2y^2 = 2(x^2+y^2) = 2n
Тобто
2n = (x+y)^2 + (x-y)^2
Власне, цю формулу можно отримати і з формули (1), якщо згадати, що 2 = 1^2 + 1^2, тобто в формулі (1) a і b = 1.

Теорема 3 (основна теорема арифметики):
Ціле число розкладається на прості множники одним єдиним способом (з точністю до перестановки множників і асоціативності)
Доведення цієї теореми залишимо за дужками.

Будь-яке число n можна представити у вигляді добутку простих чисел трьох типів: 2^a, p(i)^a(i), q(j)^b(j),
де p(i) - прості числа виду 4k+1, a(i) - ступінь числа p(i)
q(j) - прості числа виду 4k+3, b(j) - ступінь числа q(j).
Нехай Q = П q(j)^b(j)
Тоді, якщо Q не є повним квадратом (а це можливо лише тоді, коли всі b(j) парні), то n не можна розкласти на суму квадратів (критерій Жирара).
Якщо ж Q є повним квадратом, то кількість розкладів n дорівнює кількості розкладів числа П(p(i)^a(i)) на суми квадратів

Теорема 4 (формула Діріхле):
Якщо число n розкладається на суму квадратів, то кількість представлень дорівнює [ (П (a(i)+1) +1) / 2 ] (2)
(Якщо кількість множників рівна 0, то добуток вважається рівним 1. Представлення, що відрізняються порядком доданків, не розрізняються)

Запам'ятайте і цю формулу. Вона нам теж знадобиться для перевірки, що ми правильно розклали число на всі можливі суми квадратів.
Доведення цієї теореми можна знайти у тому ж самому пдф-документі (ст.21)

Основні висновки з цієї теореми: :
1) всі ступені 4k+3 мають бути парними, щоб n мало розклади
2) кількість розкладів n залежить тільки від ступенів 4k+1
3) наявність чи відсутність у розкладі двійки (2) у будь-яких ступенях не впливає ні на "розкладність" n, ні на кількість розкладів

Так от, із Теореми 4 і загальної формули (1) випливає, якщо n - парне і розкладається на суму квадратів m різними способами,
то і число n/2 розкладається на суми квадратів і до того ж теж m різними способами.
При цьому способи розкладу n/2 утворюються із розкладів n одним єдиним способом.
Яким саме - залишаю вам це завдання в якості домашнього завдання. )

Отже, запам'ятаємо цей результат:
Якщо число n має m розкладів на суму квадратів n = x(i)^2 + y(i)^2, то і число 2n має m розкладів, при цьому самі розклади утворюються одним єдиним способом:
2n = (x+y)^2 + (x-y)^2
Цей факт буде використаний пізніше.
x3mEn
Далі.
Якщо число n має m розкладів на суму квадратів n = x(i)^2 + y(i)^2, то число 4n теж має m розладів, до того ж самі розклади утворюються із розкладів n ще простіше, аніж для 2n:
4n = 2^2 * n = (2x)^2 + (2y)^2

Давайте тепер повернемося до нашої задачі.
a^2 + b^2 = d^2
a^2 + c^2 = e^2
b^2 + c^2 = f^2
a^2 + f^2 = g^2

Ребра a, b, c мають бути різні, це зрозуміло, тому
для g^2 має існувати як мінімум 3 різні розклади на суми квадратів:
g^2 = a^2 + f^2
g^2 = b^2 + e^2
g^2 = c^2 + d^2

Для того, щоб n = g^2 розкладалося на суму квадратів, потрібно, щоб у розкладі n прості числа 4k+3 були представлені у парних ступенях.
До того ж n має бути повним квадратом, а це можливо тоді і тільки тоді, коли всі прості множники n представлені у парних ступенях.

Тепер доведемо, що діагональ мінімального ідеального кубоїда є непарним числом.
По-перше зазначимо, що якщо ідеальний кубоїд існує, значить їх існує нескінченно багато.
Адже лінійно збільшуючи "габарити" кубоїда ми отримаємо так само ідеальний кубоїд.
Тому задача полягає в пошуку ідеального кубоїда мінімального розміру.

Припустимо, що просторова діагональ g є числом парним.
Тоді, як доведено вище, має розклад на суму квадратів і число (g/2)^2.
І нам відомо, яким саме єдиним чином:
(g/2)^2 = (a/2)^2 + (f/2)^2
(g/2)^2 = (b/2)^2 + (e/2)^2
(g/2)^2 = (c/2)^2 + (d/2)^2
З парності g випливає парність a, b, c, d, e, f
Отже кубоїд з парною просторовою діагоналлю g не є мінімальним.
Висновок: парні просторові діагоналі нас не цікавлять.
А значить шукана g має бути числом непарним.
x3mEn
Далі.

Теорема 5.
Якщо просте число p не можна представити у вигляді суми двох квадратів, і якщо сума квадратів x^2+y^2 кратна p, то кожне із цілих чисел x, y кратне p.
Доведення цієї теореми наведено в пдф документі на сторінці 20.

Із Теорем 1 і 5 випливає, що якщо в розкладі просторовою діагоналі g є прості числа виду 4k+3 у будь-яких ступенях, то і всі a, b, c, d, e, f кратні всім цим 4k+3, оскільки прості числа виду 4k+3 НЕ розкладаються на суму квадратів,
а значить кубоїд не є мінімальним, оскільки всю систему рівнянь можна спростити, поділивши всі рівняння на число Q = П q(j)^b(j), де q(j) - попарно різні прості числа виду 4k+3, b(j) - ступені q(j).

Таким чином якщо ідеальний кубоїд мінімального розміру існує, його просторова діагональ має мати вигляд добутку простих чисел виду 4k+1:
g = П (p(i)^a(i))
На цьому доведення цієї чудової властивості завершено.

Є питання?
Alien
алхимия какая-то =)
A1ex01
(x3mEn @ Jan 30 2011, 20:13) *

Є питання?

та да, может быстрее 3 числа в квадрате сравнить, чем делать кучу проверок?
пока вникаю nike_cannabis.gif
x3mEn
(A1ex01 @ Jan 31 2011, 14:53) *

(x3mEn @ Jan 30 2011, 20:13) *

Є питання?

та да, может быстрее 3 числа в квадрате сравнить, чем делать кучу проверок?
пока вникаю nike_cannabis.gif

Ну, по-перше, ще ніяких перевірок робити не треба, я тільки навів доведення, чому має дорівнювати просторова діагональ і, власне, вже дав підказку, яким чином її формувати.
По-друге, якщо ти пропонуєш перебирати всі комбінації трьох чисел-ребер, то для початку порахуй, скільки взагалі існує комбінацій (a, b, c), таких, що a<b<с і a^2+b^2+c^2 < 2^128
По-третє, пдінесення до квадрату 64 бітних чисел - операція дуже витратна. А ще більш витратна - добування корення з 128 бітного числа.
Ну а по-четверте, коли вирішиш проблему, як точно порахувати квадрат 64 бітного числа, а потім з точністю хоча б до третього знака після коми порахувати корінь з 128 бітного числа, приходь, розповіси.

Свого часу я розповім, яким чином я уникаю проблему виходу із 64 бітного простору, хоча, по суті, перевіряю просторові діагоналі аж до 2^64, які за формулою нібито ще треба підносити до квадрату.
Death
самое главное узнать что уже было сделано в этом направлении.
а то получится как с вайфайричем

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


та гавно вопрос

a$ = 128bitnumber$;
b$ = sqrt( a$ );
printf b$;
molo
(Death @ Jan 31 2011, 21:59) *

a$ = 128bitnumber$;
b$ = sqrt( a$ );
printf b$;

Mozha trohy konkretyky? Na chomu to napysano?

Bil'shist' cilyh (integer) chysel na .net/java obmezujet'sja 64bit -
-9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807

Dlja 128bit mabut' pryjdet'sja svij 'type' vvodyty, ale to vzhe sprava realizaciji. Chastkovo bude opydsano tut - http://perfectcuboid.com/forum/4-development

UPD .NET - decimal value type - 79,228,162,514,264,337,593,543,950,335.
Death
та ні на чому. абстракція.

я хотів сказати що це справа компілятора обчислювати корені й іншу фігню.

людина розробляє алгоритм - машина рахує.
vitalidze1
Йоптіль, як побачив ці квадрати, логарифми і іншу поєбень, аж мурашки по шкірі побігли.

PS. математику терпіти не можу fear.gif
x3mEn
vitalidze1,
ну ясно, тру кранчер
A1ex01
(x3mEn @ Jan 31 2011, 20:45) *

По-третє, пдінесення до квадрату 64 бітних чисел - операція дуже витратна. А ще більш витратна - добування корення з 128 бітного числа.
Ну а по-четверте, коли вирішиш проблему, як точно порахувати квадрат 64 бітного числа, а потім з точністю хоча б до третього знака після коми порахувати корінь з 128 бітного числа, приходь, розповіси.


SSEx пробовал?-там регистры 128бит
A1ex01
x3mEn, по кубоиду
D^2=a^2+b^2+c^2
dab^2=a^2+b^2
dbc^2=b^2+c^2
dac^2=a^2+c^2

dab^2+dbc^2+dac^2=2(a^2+b^2+c^2)=2D^2 -сумма квадратов диагоналей четная, значит 2 диагонали нечетные или три четные =>D -четное

x3mEn
A1ex01,
поясни, як ти зробив висновок, що з непарності двох із трьох діагоналей випливає парність просторової діагоналі.

Контраргумент:
D^2=a^2+b^2+c^2
dab^2=a^2+b^2
dbc^2=b^2+c^2
dac^2=a^2+c^2

неп^2=пар^2+пар^2+неп^2
пар^2=пар^2+пар^2
неп^2=пар^2+неп^2
неп^2=пар^2+неп^2

В дійсності ти вивів ще одну властивість кубоїда:
у ньому дві з трьох лицьових діагоналей непарні.
Allineer
A1ex01, x3mEn, ребят, простите... а вы сейчас с кем разговариваете? smile.gif
x3mEn
Allineer,
розмова почалась ось тут:
http://distributed.org.ua/forum/index.php?...indpost&p=66404
продовжена ось тут:
http://perfectcuboid.com/forum/6---/9
перекладена ось тут:
http://www.rechenkraft.net/phpBB/viewtopic.php?f=56&t=11559
продубльована ось тут:
http://perfectcuboid.com/forum/4-development/28-theory

Якщо сильний математик чи програміст (а краще і той і той одночасно), приєднуйся до розмови, you are welcome!
x3mEn
A1ex01,
не знаю, яким місцем ти відчув, але саме сьогодні, після майже 5 місячної перерви, я поновив роботу над задачею. Почав і вже майже закінчив писати безгуйового клієнта, заточеного на фактично виконання нарізаних гіпотетичним сервером завдань на перевірку діагоналей від і до.
Як доведу до ладу, можу викласти сорці разом із ехешником, якщо комусь цікаво буде. Я б не відмовився, якби хтось допоміг перекласти з Паскаля на С.
Без гуя в програмі залишилася чиста математика: динамічні масиви, 64 бітні цілі, сортування, перестановки і таке інше.
Адмін yoyo@home обіцяв розглянути можливість розгортання підпроекту на німецькому сервері, за умови, якщо прога буде написана на С. В них є досвід перекладання не-БОЇНК проектів на рейки БОЇНК.
A1ex01
если 2 диагонали нечетные

dab^2=a^2+b^2
dbc^2=b^2+c^2
dac^2=a^2+c^2
пусть dab и dbc нечет, тогда если a^2 нечет то и с^2 нечет, а b^2-чет

D^2=a^2+b^2+c^2
и в сумме D^2 -чет

правда, если a^2 чет то и с^2 чет, а b^2-нечет
D^2=a^2+b^2+c^2
и в сумме D^2 -нечет

значит D и чет и нечет st.gif
x3mEn
пусть dab и dbc нечет, тогда если a^2 нечет то и с^2 нечет, а b^2-чет

D^2=a^2+b^2+c^2
и в сумме D^2 -чет

ця ситуація неможлива, оскільки серед a, b, c тільки одне ребро може бути непарним.
Джерело: http://en.wikipedia.org/wiki/Perfect_cuboid
Some interesting facts about a primitive perfect cuboid:
  • 2 of the edges {a,b,c} must be even and 1 edge must be odd
  • 1 edge must be divisible by 4 and 1 edge must be divisible by 16
  • 1 edge must be divisible by 3 and 1 edge must be divisible by 9
  • 1 edge must be divisible by 5
  • 1 edge must be divisible by 7
  • 1 edge must be divisible by 11
  • 1 edge must be divisible by 19.
x3mEn
Закінчив писати консольну версію програми.
Хтось може помогти перекласти програму на С/С++?
Rilian
x3mEn, http://distributed.org.ua/forum/index.php?...522&#entry77522

ты в новостях smile.gif
.
Invision Power Board © 2001-2019 Invision Power Services, Inc.