Приветствую, матанон. Есть ли какие-либо алгоритмы, или формулы позволяющие генерировать гарантированно простое число - заданной битности? Первое, что приходит в голову, так это использовать арифметические прогрессии в PrimeGrid: http://www.primegrid.com/stats_ap26.php И хотя числа простые, и их не надо проверять - там нельзя выбрать битность.
>>38039 (OP) Нашёл формулу p = 6k ± 1, но она иногда даёт простое, в одном из случаев (плюс или минус), а иногда - простые числа-близнецы. Поэтому надо проверять числа на простоту.
>>38039 (OP) >Есть ли какие-либо алгоритмы, или формулы позволяющие генерировать >гарантированно простое число - заданной битности? Нет и не может быть.
>>38043 Всякое простое число, большее 3, представимо в виде 6k + 1 или 6k−1, где k — некоторое натуральное число. Таким образом, формула p = 6k ± 1, выдаёт либо простое число, либо составное (в зависимости от того плюсуется ли 1 или отнимется), либо сразу выдаёт - простые числа-близнецы (числа простые и при отнимании и при добавлении единицы).
Ты говоришь нет и быть не может, но есть же формулы для диапазонов простых чисел, как например, следующие прогрессии из простых чисел:
6171054912832631+366384⋅23#⋅n for n=0..24 43142746595714191+23681770⋅23#⋅n for n=0..25 468395662504823+205619⋅23#⋅n for n=0..23 293037522812241983+42713298⋅23#·n for n =0..24 161004359399459161+47715109⋅23#·n for n =0..25 556904117141899+1105111⋅23#⋅n for n=0..21 1059297083391793+408270⋅23#⋅n for n=0..21 660593947782971+5414270⋅23#⋅n for n=0..22 542440132260899+4560607⋅23#⋅n for n=0..22 3465600168789197+3405459⋅23#⋅n for n=0..22 489357377433019+2701556⋅23#⋅n for n=0..22 43760869165417+2339805⋅23#⋅n for n=0..22 1172380401690583+1675204⋅23#⋅n for n=0..22
Где, 23# - праймориал от числа 23. Он равен 23# = 2⋅3⋅5⋅7⋅11⋅13⋅17⋅19⋅23 = 223092870 Дальше перебирается n - от 0 до числа, и считаются простые числа: 6171054912832631+366384⋅23#⋅0 = 6171054912832631 6171054912832631+366384⋅23#⋅1 = 6171054912832631+366384⋅23#⋅1 = 6171054912832631+366384⋅223092870⋅1 = 6252792570914711 и т. д. - Все числа простые, если ввести их в wolframalpha.com, и посмотреть там Prime factorization.
Так вот, я думаю, что в распределении чисел k, содержащих простые числа-близнецы - может быть какой-то закон, зависящий от пи, по формуле Эйлера, или от логарифма какого-нибудь, например от логарифма квадрата пи. Есть же формула Валлиса.
>>38045 Диапазон [n!+2 .. n!+n] не содержит ни одного простого числа, т.к. все их можно представить в виде x(n!/x+1). Если n устремляем к бесконечности, получается, что существует бесконечно большой непрерывный диапазон составных чисел. А значит, или перед ним находится последнее простое число (что доказано, что не так) или функция распределения должна перескочить через бесконечность к следующему простому числу, что невозможно.
>>38050 Дело в том, что каждое число может быть записано в виде 6n, 6n+1, 6n+2, 6n+3, 6n+4 или 6n+5. Совершенно очевидно, что 6n всегда делится на 6, 6n + 1 может быть простым, 6n + 2 всегда будет делиться на 2, 6n + 3 на 3, а 6n + 4 на 2. 6n + 5 может быть простым.
Поэтому кандидаты на простые числа составляют 6n + 1 и 6n + 5. Можно видеть, что 6n + 5 = 6 (n + 1) -1 = 6x - 1; и 6n + 5 = 6 (n + 1) -1 = 6x-1 И каждое простое число можно записать в виде 6n ± 1.
>Существуют k, для которых и 6k+1 и 6k-1 составные. Да, я уже вижу такое k 6×1000000 + 1 = 6000001 = (7^2 × 122449) его факторизация, не простое. 6×1000000 - 1 = 5999999 = (1013 × 5923) его факторизация, не простое.
Возможно, есть какие-то особые свойства у числа k? Или, быть может, если расписать значения k для чисел-близнецов - в последовательность, вырисуется что-то закономерное? Первые 100 значений k, начиная от нуля, включительно: 0×6-1 = -1 0×6+1 = 1
>>38046 Что это за формула такая большая? Что означают буквы там и как их подставлять, чтоб получить простое число? Насколько я понял, там, в этом множестве - целая система уравнений, так?
Эти полиномы содержат дофига простых чисел. В общем виде n^2 - n + x, при различных x: 41 -> можно получить 2208197 55661 -> 2478942 простых чисел 333491 -> 2535780 простых чисел 701147 -> 2587904 простых чисел Это только если минус n в полиноме, а ещё может быть плюс n.
n^2 - n + 361637 n^2 - n + 383681 n^2 - n + 601037 n^2 - n + 206807
Наверняка, вместо -n можно прикрутить туда и +n А ещё нашёл такую последовательность чисел: https://oeis.org/A060392 Так и не понял толком что она значит, но возможно некоторые числа из неё можно использовать в полиномах, чтоб получить формулу для какого-нибудь длинного диапазона простых чисел.
>>38058 >Тут кто-то в этом разделе как-то писал, что если перемножить все простые числа и прибавить единицу получится простое число. Это работает, только если простых чисел конечное число.
>>38059 >Это работает, только если простых чисел конечное число. То есть, ты хочешь сказать, что делители 317 и 703763, на которые делится число 223092871 не принадлежат какому-то множеству, и поэтому число можно считать простым?
Например, после числа 23, следующее простое число 29, число перед ним - 28, и множество содержащее конечное количество простых чисел 1·2·3·5·7·11·13·17·19·23 - имеет вид вот такой {0-28}, и ни 317 ни 703763 - не входят в это множество. Поэтому число 223092871 не разделится ни на одно из чисел от 1 до 28, являясь при этом простым для этого множества. Всё верно? Если да, то это так вообще? То есть дейстительно ли наименьшее из чисел, на которые факторизуется большое число - обязательно вылазит за множество? И можно ли так генерировать псевдопростые числа заданной битности?
>>38053 >Что это за формула такая большая? >Что означают буквы там и как их подставлять, чтоб получить простое число? Целые неотрицательные числа подставляй вместо букв.
>>38061 Ты пишешь странно, мне тяжело читать. Суть в том, что если множество P простых чисел конечно, то их p=(произведение+1) должно делится на какое-то число из P, но оно не делится ни на одно из них. Значит либо p простое, либо делится на какое-то простое число, не лежащее в P. Но P, по условию, содержит все простые числа. Противоречие. Поэтому простых чисел бесконечное количество.
>>38062 При если генерировать эти числа от 1 до 10 - то получается какое-то большое отрицательное число: https://jsfiddle.net/98o1p5mt Исходник - открыт там. Можешь нажать кнопку Run и проверить. В консоли браузера - тоже выводится это число. Можешь проверить код и подправить, если что.
>>38064 Ну так я и спросил действительно ли оно не делится?
>>38066 Написал туда (k-1), вместо (k+2). Вот тут исправлено: https://jsfiddle.net/98o1p5mt/3/ Но всё-равно получаются числа большие и отрицательные. Если генерировать значения переменных от 1 до 10-ти, то в фигурных скобках получается единица - минус сумма квадратов. Если эту сумму квадратов заменить буквой x, то видно, что (k + 2)(1 - x) = k - kx + 2 - 2x = (k + 2) - x · (k + 2) То есть, при большом x, значение x·(k + 2) будет большим числом, поэтому - результат отрицателен.
>>38070 https://ru.wikipedia.org/wiki/Простое_число#Формулы_для_нахождения_простых_чисел Там ещё вот что написано: >второй множитель этого многочлена (в фигурных скобках) имеет форму: единица минус сумма квадратов. >Таким образом, многочлен может принимать положительные значения (при положительных k) >только если, каждый из этих квадратов (т.е. каждый многочлен в квадратных скобках) равен нулю. >В этом случае выражение в фигурных скобках будет равно 1. Но тогда, при x = 0, (k+2)·(1-0) = 1·(k+2), и при k = 6, (k+2) = 8 - и это не простое число.
Короче, попробовал ещё засунуть туда отрицательное k вместе с переменными от 1 до 10, но не получается сгенерировать ни одно простое число. var k = 0-getRandomInt(1, 10);
Наверное потому, что это k - есть внутри фигурных скобок.
В общем, не понятно как использовать этот многочлен, для получения простых чисел.
Поэтому, наилучшими формулами для генерации простых чисел - я вижу арифметические прогрессии с PrimeGrid и полиномы, подобные полиному Эйлера, которые имеют обий вид x^2 ± x + p: n^2 ± n + 17; n^2 ± n + 41; n^2 ± n + 55661; n^2 ± n + 333491; n^2 ± n + 701147; n^2 ± n + 361637; n^2 ± n + 383681; n^2 ± n + 601037; n^2 ± n + 206807; Но все числа из них полученные - всё-равно надо проверять на простоту.
Например, когда формула имеет вид x^2 - x + p, при значении x = p, -p + p = 0, и число равно x^2 - получается очевидное не простое, и факторизуется оно как (x · x);
>>38061 Если число делится на одно из натуральных, в котором лежат числа множества простых, то это число разделится и на простые числа. >>38066 >Ну так я и спросил действительно ли оно не делится? Пикрелейтед. Страница 57, книга "Простая одержимость. Бернхард Риман и величайшая нерешенная проблема в математике", автор Джон Дербишир.
>>38082 Нет, я же оставил цитату, и выделил жирным. Там в википедии написано, что когда каждый из квадратов (и каждый многочлен в квадратных скобках), равен нулю, то полином Джонса принимает положительные значения. Я занулил всё в квадратных скобках, чтобы показать, что например при k = 6, полином даёт положительное число 8, и это не простое число.
Я не вижу списка прогрессий от 0 до 19 в PrimeGrid, но я вижу, что есть множество арифметических прогрессий у пользователей PrimeGrid. Сейчас я последовательно перебираю ссылки вида http://www.primegrid.com/ap.php?userid=N, где N - номер пользователя. И извлекаю прогрессии. Все эти арифметические прогрессии - запишу в массив, и запхну его - в генератор простых чисел. Он будет выбирать прогрессию из списка и генерировать n, после чего - возвращать гарантированно простое число. Я ещё сохраняю номера пользователей, которые содержат в статистике арифметические прогрессии. Потому что количество таких прогрессий у них может расти по мере продолжения их вычислений.
Я сам, с двумя 1080Ti - нашёл 45 арифметических прогрессий с длинной от 20 до 21, и их количество растёт. Но в администрации PrimeGrid сказали мне, что они не публикуют такие маленькие прогрессии, и это по причине их большого количества. Они публикуют только большие открытия и это прогрессии с длиной от 23 до 26. Я думал, что есть последовательности, вроде OEIS, содержащие все прогрессии с длиной 20 и меньше, и как только какой-то пользователь находит прогрессию - сразу же эти списки обновляются. Ан-нет!.. Приходится выколупывать их ещё и руками, лол. Ну... JS помощь, хоть это радует.
>>38083 >Там в википедии написано, что когда каждый из квадратов (и каждый многочлен в квадратных скобках), >равен нулю, то полином Джонса принимает положительные значения. Равен нулю каждый из квадратов или нет зависит от k. Наверняка при k = 6 скобки нулю не равны.
>>38091 Вот другой вид полинома, на картинке. k стоит не в каждой квадратной скобке. После выражений в квадратных скобках происходит возведение этих выражений в квадрат. Если все квадратные скобки равны нулю, как написано в википедии, и если это является условием для положительного значения этого полинома, то скобка (1-0) = 1, и после перемножения (k+2) на эту единицу - остаётся лишь (k+2). При любом k кратном двум, результат полинома будет делиться на два - и это не простое число.
>>38083 >Сейчас я последовательно перебираю ссылки вида http://www.primegrid.com/ap.php?userid=N >где N - номер пользователя. И извлекаю прогрессии. Там, на PrimeGrid.com около миллиона пользователей, вот номер последнего из них: 999980 Я открываю по 50 окон при помощи JS через window.open и закрываю их по одному - у тех, у кого нет прогрессий. Затем копирую прогрессии в текстовый файл, и засовываю его в скрипт - после этого, получаю массив прогрессий. Настолько нудное занятие закрывать эти окна. Может есть где нормальные парсеры, чтоб слить все прогрессии с сайта? Когда будет полный список, может быть даже там найдутся - прогрессии из прогрессий.
>>38039 (OP) Просто отвечу здесь вот этому древнему анону, может будет проходить мимо: https://2ch.hk/math/res/21096.html#22462 >Хочу создать свою личную криптовалюту, повелся на хайп. >Но вместо того чтобы компуктеры считали какую то белиберду цифро-буквенную >хочу сделать так чтобы считалась математическая белиберда.
>Сейчас я только додумался заставить комплекторы перебирать все числа от двух до бесконечности >на простоту и вести в блокчейн записи уровня "2 простое число, 6 делится на 1-2-3-6, >147 делится на 3-7-21-49, т.д." >Нахуя? Потому что могут. Ну и плюс потом в будущем, ящитаю, >возможно понадобится кому то знать является ли число >1749369875873489562938483726489517389910463036490265936748495727659474191037703763535 простым или нет. >Числа Mерсена вычислять нихуя не подходит, так как только НЕКОТОРЫЕ из чисел мерсена простые, >возможно что даже конечное множество. А еще они пропускают некоторые простые числа при последовательном увеличении степени >Есть еще что то такое чем математика может занять вычислительные мощности?
Простых чисел Мерсенна - всего 50. Наибольшее из них - 277232917 − 1 нашли в проекте GIMPS, в декабре 2017-го.
Если уж в блокчейн совать числа, то лучше научиться ужимать их оптимальнейшим образом, вот так, как делают эти: http://www.primegrid.com/primes/mega_primes.php В одной транзакции блокчейна - можно запхнуть миллион простых чисел. Ну и конечно же, если бы они были записаны вряд, то можно было бы генерировать простые числа из них, из этих предыдущих простых чисел - попыткой деления на них, и даже переводить их - с кошелька на кошелёк, находя всей сетью - следующее простое число. Всё это вместе упаковывалось бы в различные прогрессии, которые могли бы описываться множеством переменных. Но право на числа в блокчейне висело бы на адресах. Они могли бы котироваться, шифроваться, и сами использоваться для шифрования. К тому же эмиссия простых чисел - ограничена. https://ru.wikipedia.org/wiki/Теорема_о_распределении_простых_чисел И сложность их добычи - занимала бы весь хешрейт сети.
>>38367 Ещё сюда добавлю ответ вот на это: >Если кто не понял что я хочу, математические проблемы которые пока не имеют способов решения кроме как тупым перебором. >Чтобы суть задачи вроде простая как два пальца обоссать асфальтом, типа последовательности простых чисел 2-3-5-7-11-13-17-19-23-29-31, а найти >например 867 простое число, кроме как тупо перебирать все числа с калькулятором, невозможно было. В вольфраме для этого есть специальная опция. Например - миллиардное простое число. https://www.wolframalpha.com/input/?i=1,000,000,000th+prime
>>38047 >все их можно представить в виде x(n!/x+1) У тебя две переменные там. Откуда ты это взял? Представь мне число 999999999989 в через факториал. Я знаю, что есть https://ru.wikipedia.org/wiki/Факториальное_простое_число но это отдельный тип чисел. Среди них нет 11 и 13 - а это числа близнецы. К тому же, В 2013 году Итан Чжан отправил в журнал Annals of Mathematics статью, в которой доказывалось что существует бесконечно много пар последовательных простых чисел с разностью не более 70 миллионов.
Затем, после того, как слил сайт - написал прогу на питоне для проверки чисел по списку, делением их - на все простые, до корня из числа. Она есть там на страницах why. Удобно юзать списки, очень быстро проверяется числа. Сейчас от нехуй делать - бручу у себя, питоном, второй триллион среди всех нечётных чисел, p = 6k ± 1 исключив другие из этих: >>38052 условие для цикла: if (i%6==3) or (i%6==2) or (i%5==0): continue; Количество чисел - проверяю в вольфраме, запросом prime[начальное_простое, конечное]
>>38435 А их можно как-то ещё сильнее ужать - особенно те, что в конце? Ну - чтоб не расписывать их полностью... Файл Ate_100G_part1.txt из архива Ate_100G_part1.7z занимает 90,1 МБ (94 484 450 байт), сам архив 11,9 МБ (12 536 200 байт). А предпоследний текстовый файл из архива, с 10-ю миллионами чисел который, так он вообще 124 МБ (131 000 000 байт) занимает.
Может простые числа, можно представить как в PrimeGrid - каким-нибудь разложением? То, что все простые числа могут быть представлены как 6k ± 1, уже позволяет сжать их, записав только значение k и один бит рядом, соответствующий либо сложению либо вычитанию единицы...
>>38439 Может это поможет: https://books.google.com/books?id=P5H9AgAAQBAJ&pg=PA332 Каждое простое число (кроме чисел вида 8n-1) можно представить в виде суммы трех квадратов. Наверняка и числа вида 8n-1 можно как-то разложить. Например, вот так: 8n-1 = a^2 + b^2 + c^2 n = 1/8(1 + a^2 + b^2 + c^2)
>>38434 >У тебя две переменные там. >Откуда ты это взял? Все числа этого диапазона имеют вид n! + x, где x = 2..n. А n! + x это x(n!/x+1). Два множителя - число составное.
>>38439 Они там - по цифрам пишутся, текстом, через разделитель. Можно минусовать триллион от каждого, и записать этот триллион - в начале файла. Можно ещё, ужать текст - в сами числа, тогда выйдет не более 6 байт на каждое число, и разделитель тогда не нужен будет. Но думаю, лучше, наверное, оставить в виде текста (так понятнее что за файл) и использовать архиватор. А ещё, думал разложить числа в степени двойки и записать сами степени. То есть сами адреса бит, или последовательность их смещений относительно номера предыдущего адреса с единичным битом. Но если так жать файл, там будет неведомый HEX внутри, читаемый только программой, и его можно удалить ненароком. На данный момент, я нашёл около миллиона чисел, свыше триллиона.
>>38453 На квадраты - долго раскладываются каждое из чисел. Уже проверил двумя циклами. К тому же тройка чисел a, b, c - больше бит занимают вместе, чем само число.
>>38458 >существует бесконечно большой непрерывный диапазон составных чисел Я-то думал эти диапазоны можно исключить в коде, чтоб ускорить проверку чисел на простоту.
Ну ты там это... Поставь вместо n, хотя-бы 20, и ты увидишь насколько это "бесконечно большой диапазон" - с разницей лишь в 18 натуральных чисел. :)
>>38459 Хаххахх. А факториал от бесконечности считать научишь-то?
Кстати, вот тут https://alexlotov.livejournal.com/540579.html можно видеть, что диапазон [(70млн. + 1)! + 2, (70 млн. + 1)+(70 млн. + 1)] - таки не содержит ни одного простого числа.
>>38578 Именно вот - гарантированно простое, и именно заданной битности.
Вот, смотри - есть например, алгоритм RSA: https://ru.wikipedia.org/wiki/RSA#Пример По нему, сначала, выбираются два простых числа - это p и q, из них - получают n, их перемножением (p×q), и потом считают функцию Эйлера - φ(n). Для любого одиночного простого числа, φ(p) = (p-1), то есть функция Эйлера - равна ВСЕМ натуральным числам, стоящим до него, Поэтому φ(n) = (p-1)(q-1), если n = p×q, где p и q - простые числа.
>или сойдет вероятность 0.999999 (столько девяток сколько сам захочешь)? А так-то, если речь идёт о "вероятности простоты", то сошло бы и любое нечётное псевдопростое, или "возможно простое". Ведь функция Эйлера имеющая вид φ(p) = (p-1), для непростого числа не совсем корректна, и если число делить, и если оно таки-разделится, то где-то обязательно появляются нули, а из-за этого могут быть лаги. Но у любом нечётного, даже если оно разделится на какое-либо число до его половины (или на какое-то простое до его корня), всё-равно деление его на делители, в диапазоне - от половины этого числа до самого этого числа, даёт какой-то ненулевой статок. На пикрелейтед видно, что шарики в конце - перекатываются по одному.
Например, если взять число 77, и представить его в виде (частное×делитель + остаток), то по возрастанию делителя видно, что: 77 = 38×2 + 1 = 25×3 + 2 = 19×4 + 1 = 15×5 + 2 = 12×6 + 5 = 11×7 + 0 (разделилось на 7) = 9×8 + 5 = 8×9 + 5 = 7×10 + 7 = 7×11 + 0 (разделилось на 11) = 6×12 + 5 = 6×12 + 5 = 5×13 + 12 = 5×14 + 7 = 5×15 + 2 = 4×16 + 13 = 4×17 + 9 = 4×18 + 5 = 4×19 + 1 = 3×20 + 17 = 3×21 + 14 = 3×22 + 11 = 3×23 + 8 = 3×24 + 5 = 3×25 + 2 = 2×26 + 25 = 2×27 + 23 = 2×28 + 21 = 2×29 + 19 = 2×30 + 17 = 2×31 + 15 = 2×32 + 13 = 2×33 + 11 = 2×34 + 9 = 2×35 + 7 = 2×36 + 5 = 2×37 + 3 = 2×38 + 1 = 1×39 + 38 (тут делитель уже больше половины числа - 38.5) = 1×40 + 37 (дальше, когда шарики в числе уложены в два ряда, то эти шарики перекатываются по одному) = 1×41 + 36 = 1×42 + 35... И при увеличении частного на единицу - остатки убывают на единицу.
Поэтому, если выбрать делитель больше половины числа, криптосистема должна будет работать, однако для внешнего криптоаналитика, наличие единицы в частном - будет немалозначимым, и может позволить ему восстановить само число. Заметь, что при делителе до половины числа (от 2 до 38) - имеет место быть, непоследовательное распределение остатков, и поскольку частное в модульной арифметике - не учитывается, а только остатки, то получить из остатков само число (77) - трудно. А в случае единицы в частном, можно получить и само число (оно равно делитель + остаток).
>>38468 >Ну ты там это... Поставь вместо n, хотя-бы 20, и ты увидишь насколько это "бесконечно большой диапазон" Ну ты подумай, что будет быстрее для очень больших чисел, проверка на простоту или проверка на то, является ли это число числом вида n!+x, x<n+1 (по сути можно просто занести их в массив до определенного n).
>>38582 Да, при длинных числах, хоть этот диапазон чисел и незначителен, но нагрузка на проверку числел - падает, если пропустить этот диапазон, ведь для проверки надо делить на все простые до корня от числа, и проще проверить большие числа - сразу уже так.
>>38586 >Можно хранить простые, например, как пару (n,k), где 30n+k твое число. Ой, тут на самом деле закралось - некое подобие решета Эрастофена: http://www.codenet.ru/progr/alg/normalize/ >N = {30n+1} + {30n+7}+ {30n+11} + {30n+13}+ {30n+17} + {30n+19}+ {30n+23} + {30n+29} , n = (0, ∞] С виду, формула имеет вид x⋅n+p, где p - простое число, которое ты обозначил как k. Число x = 30 - означает количество строк в таблице, на пик1. Числа, k которые прибавляются - а это 1, 7, 11, 13, 17, 19, 23 и 29 - они все простые (я их обозначил как p), и они означают количество первое число из невычеркнутых строк, в таблице. Простые числа 2, 3 и 5 вместе с кратными им строками - вычеркнуты, поэтому они исключены из ряда натуральных N.
На картинке 2, видно, что строк может быть больше (x = 210 и 2310), если вычеркнуть все строки кратные числам k = 7 и 11. Тогда, ряд натуральных N, для поиска простых чисел - должен будет принять вид, наподобие: N = {210n+1} + {210n+11} + {210n+13}+ {210n+17} + {210n+19}+ {210n+23} + {210n+29} + ... + {210n+199} где, вместо "..." - вот это вот всё: https://www.wolframalpha.com/input/?i=prime%5B0,210%5D Таким образом, простые числа могли бы быть выражены как x⋅n + p, где x - количество строк (второй столбец на пик2), p - как мне кажется - простое число от нуля до максимального количества строк, n - какое-либо натуральное число. Так, например, простое число 1000079817311 может быть записано следующим образом: p = xn + k Но я вижу, что некоторые остатки k - не простые: 1000079817311 = 6 ⋅ 166679969551 + 5 (простое) = 30 ⋅ 33335993910 + 11 (простое)= 210 ⋅ 4762284844 + 71 (простое) = 2310 ⋅ 432934985 + 1961 (тут остаток - не простое, оно равно 37×53) = 30030 ⋅ 33302691 + 6581 (простое) = 510510 ⋅ 1958981 + 427001 (простое) = 9699690 ⋅ 103104 + 2979551 (простое) = 223092870 ⋅ 4482 + 177573971 (простое) = 6469693230 ⋅ 154 + 3747059891 (не простое, факторизуется как 109×1629119) = 200560490130 ⋅ 4 + 197837856791 (простое) ... C чего бы это?
Но даже если записывать простое число как x⋅n + k, где остаток k может быть составным, то как видно, пара чисел n, k - занимает больше бит, чем двоичный вид самого числа. Поэтому в списке первых 10 миллионов чисел, следующих за триллионным натуральным: prime[1000000000000, 1000276307647] https://www.wolframalpha.com/input/?i=prime%5B1000000000000,+1000276307647%5D можно просто минусовать один триллион, и писать сам остаток - в виде бит. Вот так 1000079817311 = 1000000000000 + (79817311->в файл) так как запись остатка: 100110000011110101001011111(2) = 79817311(10) намного короче чем запись числа 1110100011011001011001101111101001011111(2) = 1000079817311(10) При этом, последнее 10-миллионное число 1000276307647 имеет остаток 10000011110000001111010111111(2) = 276307647(10) 00010000 01111000 00011110 10111111, и это - по 4 байта на каждое число, а не по 5: 11101000 11011001 01100110 11111010 01011111 (для полной записи числа) и уж тем более не по 13 байт - если писать однобайтными симолами все цифры числа. Но я буду всё-же писать их в файл символами (+ затем ужму 7z) - просто так читабельнее для txt.
>>38589 >то как видно, пара чисел n, k - занимает больше бит, чем двоичный вид самого числа. если хранить в двоичном формате, то неясно, что служит разделителем чисел. И опять же ты хранить в txt, так что xn + p может быть эффективнее
>>38591 >если хранить в двоичном формате, то неясно, что служит разделителем чисел. Можно выделить на каждое число в конкретном диапазоне - по x байт, тогда и разделитель не нужен. Например, в диапазоне https://www.wolframalpha.com/input/?i=prime%5B1000000000000,+1000276307647%5D первое простое число 1000000000039 последнее 1000276307647. В двоичный вид их: 1110100011010100101001010001000000100111(2) = 1000000000039(10) 1110100011100101000111010010111010111111(2) = 1000276307647(10) Теперь по байтам: 11101000 11010100 10100101 00010000 00100111 - 5 байт по 8 бит. 11101000 11100101 00011101 00101110 10111111 - тоже. Но если отнимать триллион от каждого числа, то первое число может быть представлено просто как 39, последнее - как 276307647. Итого: 100111(2) = 39(10) 10000011110000001111010111111(2) = 276307647(10) и двоичный вид их может быть выражен четырьмя байтами на каждое число: 00000000 00000000 00000000 00100111 - 4 байта 00010000 01111000 00011110 10111111 - тоже. Причём без всяких разделителей. Количество байт и триллион к суммированию - в начале файла указать, и всё.
Но если так делать, файл с простыми числами будет бинарным, а не текстовым. Можно убить много времени на его создание, а потом тупо забыть, и ненароком удалить из-за неведомой, нечитабельной хуиты внутри.
>И опять же ты хранить в txt, так что xn + p может быть эффективнее Я тебе уже показал, что запись двух чисел не снижает количество бит на число. Но, наглядно, покажу ещё раз: 1000079817311 = 30 ⋅ 33335993910 + 11 1110100011011001011001101111101001011111(2) = 11101000 11011001 01100110 11111010 01011111(2) = 1000079817311(10) - само число, 5 байт.
11111000010111110101110011000110110+1011 даже если не дополнять нулями и не делить по байтам, нужен разделитель, и по длине два числа почти как полная запись одного числа. Разве что минус 1 бит. Иначе - 6 байт, вместо пяти на каждое число, а это уже - избыточно, и писать само число.
>>38592 Информация в принципе несжимаема. Если есть число N, то для его хранения необходимо минимум ceil(log2(N)) бит и именно столько число N занимает в двоичном виде. Любые другие формы записи этого числа потребуют больше бит для его хранения.
>>38435 Сделал там в TOR'е - отдельную папку FOLDER_FOR_UPLOADS, куда можно загружать всякие файлы на сервер. У кого есть списки простых чисел или какие-то программы для параллельного поиска их видеокартами - можете залить. Ну и алсо, всякую хуйню можете ещё позаливать, типа котиков-наркотиков, лол.
>>38600 Это частные случаи. Универсального способа записать любое число так, чтобы оно занимало меньше бит, чем в двоичном виде - не существует. Так-то можно и список всех простых чисел на серверах гугла составить, а у себя хранить только их индексы. Первые 264 простых чисел будут всего по 8 байт.
>>38602 >Так-то можно и список всех простых чисел на серверах гугла составить, а у себя хранить только их индексы. >Первые 264 простых чисел будут всего по 8 байт. Вольфрам Альфа, по всей видимости, так и делает. В запросе http://www.wolframalpha.com/input/?i=prime%5B1000082617987,1000082617987%5D можно видеть одно простое число 1000082617987. Если же навести курсор на него и выбрать plaintext, то видно следующее: Prime[Range[37610901576, 37610901576]]. Такие запросы не работают в вольфраме, но это порядковый номер, индекс - этого простого числа, в диапазоне от нуля до его самого.
В этом можно убедиться, если ввести тут https://primes.utm.edu/nthprime/index.php в поле Pi function - само это число: >There are 37,610,901,576 primes less than or equal to 1,000,082,617,987. А также, если ввести в Nth Prime индекс - 37610901576: >The 37,610,901,576th prime is 1,000,082,617,987. вот это оно и есть.
Я также вижу что у них там и про алгоритм что-то написано, но ничего не понял.
>>38607 >Я также вижу что у них там и про алгоритм что-то написано, но ничего не понял. Зато там есть пи-функция от 1 до 30 триллионов: >There are 1,000,121,668,853 primes less than or equal to 30,000,000,000,000. триллионное простое число со значением около 30 триллионов: >The 1,000,000,000,000th prime is 29,996,224,275,833. там есть генератор случайного простого числа с порядковым номером от 1-го до триллионного, и главное - там есть HTTPS.
>>38618 >и ужимать в комбинации простых чисел А, вот оно что. Пока ты не потратил пол жизни на написание нового архиватора Попова, который винрарно сожмет весь интернет на флешку, поясню, почему информация в принципе несжимаема. Допустим, у нас есть информация размером N бит и супер функция, которая сжимает ее хотя бы на один бит (гарантированно). Данные у нас хранятся в файлах, а значит всего может существовать 2N различных файлов. Полученные нашей функцией архивы будут иметь размер максимум N-1 бит, а значит может существовать не более 2N-1 архивов. Т.е. распаковать наши архивы в исходные файлы без коллизий не получится - архивов всегда минимум в два раза меньше.
>>38621 Говоришь так, как будто дерево директрий нельзя записать в txt-файл и ужать этот текстовый файл архиватором. >Допустим, у нас есть информация размером N бит и супер функция, которая сжимает ее хотя бы на один бит (гарантированно). Ок. >Данные у нас хранятся в файлах, а значит всего может существовать 2N различных файлов. Если по биту на каждый файл писать, то они представляют из себя копии одного и того же файла. Поэтому при помощи жестких ссылок hardlink - можно минимизировать инфу, сведя её лишь до двух секторов на диске, и до списка файлов в файловой системе (тот самый txt-шник, о котором я писал выше, с путями и именами файлов). >Полученные нашей функцией архивы будут иметь размер максимум N-1 бит, а значит может существовать не более 2N-1 архивов. А нафига ты по одному биту в каждый архив писать собрася? >Т.е. распаковать наши архивы в исходные файлы без коллизий не получится - архивов всегда минимум в два раза меньше. Как будто один архив за счёт вычислительных мощностей, при распаковке - не может писать на диск, много архивов.
Кстати, вот здесь: >>38589 по ссылке >http://www.codenet.ru/progr/alg/normalize/ внутри, есть код, и ссылка на программу с описанием её: >http://www.codenet.ru/np-includes/upload/2007/08/21/128152.zip Программа произодит нормализацию исходного кода файлов. Я попробовал сделать нормализацию, и вижу в шестнадцатиричном редакторе шестнадцатиричный шум наподобие крипторандома. Автор пишет, что нормализация означает, что: >в получаемом файле соотношение 0 и 1 всегда почти точно 50% на 50% Так вот, программа эта, нормализованный файл - может денормализовать назад, в прежний вид. (я нормализовывал ею файл этого же архива). После денормализации - архив снова открывается архиватором. А это значило бы, что при помощи подобных программ, в процессе денормализации данных, можно было бы снизить энтропию (то есть почти равномерное распределение нулей и единиц в бинарном коде файла).
Это получается - что-то типа синергетической архивации, основанной на негэнтропии.
>>38622 Ты нихуя не понял. Файлы не хранят по одному биту и в архивы пишутся не по одному биту. Ты можешь взять любое N, например - 10. Т.е. каждый файл будет хранить 10 бит и всего может существовать 1024 разных файла размером 10 бит, 1025-й уже будет копией одного из предыдущих. Если мы эти 10-тибитные файлы пожмем универсальной суперфункцией до 9 бит, то получим 512 различных архивов. 513-й уже будет копией одного из существующих архивов. А из 512 возможных архивов сделать 1024 исходных файла, очевидно, невозможно.
Все существующие архиваторы занимаются удалением избыточности, т.е. фактически просто переписывают исходное сообщение другим алфавитом, созданным специально для этого сообщения. Попробуй сжать рандомные данные (где нет избыточности) любым существующим архиватором и результат будет больше исходных данных.
>>38624 >А из 512 возможных архивов сделать 1024 исходных файла, очевидно, невозможно. Когда разархивируешь какой-нибудь zip ты из одного файла много делаешь же. >Попробуй сжать рандомные данные (где нет избыточности) любым существующим архиватором и результат будет больше исходных данных. Так вот я и намекал выше на архивацию с уменьшением энтропии - то есть работающую, на принципах синергетической самоорганизации.
>>38628 >Так вот я и намекал выше на архивацию с уменьшением энтропии Двоичная форма - это запись с минимально возможной энтропией. Ее уже невозможно там уменьшить.
>>38628 >Когда разархивируешь какой-нибудь zip ты из одного файла много делаешь же. Ты наркоман, чтоле? В последний раз, предельный случай: У нас есть информация размером 2 бита. Все возможные варианты: 00 01 10 11 У нас есть функция, сжимающая информацию на один бит. Все возможные результаты: 0 1 Мощность множества "архивов" меньше мощности множества "данных". Обратное восстановление невозможно.
>>38621 >Допустим, у нас есть информация размером N бит и супер функция, которая сжимает ее хотя бы на один бит (гарантированно). Для меня не очень понятно, как невозможность существования такой функции может быть неочевидна для твоего собеседника.
>>38039 (OP) Я ОП, и я вернулся. Итак, самым эффективным алгоритмом генерации оказался - тест Миллера-Рабина, сомещённый с циклом перебора нечётных, имеющих вид 6k±1. За подсказку - спасибо >>38576-анону. https://gist.github.com/bnlucas/5857478 вот здесь - рабочий исходник на языке Python. В википедии, псевдокод - нерабочий. Чтобы всё это работало - нужно поставить пистон и добавить в начало две строки: import random from random import randrange И в конец - можно добавить это: number = input("Input the number: "); print(miller_rabin(int(number))) или это: #numbers array input_nums = [ 112925255197241067691991, 258288191437393543032381, 1685579612271893009957, 355849543052141644347763, 690189687285399364733225, 168915076940107245134713, 237511420791257209734169, 77275506460653546416341, 459787368207055542960105, 641800620656532268941589, 886673240805426141859665, 605677968519203132991021, 88927130156883467219963, 198992278326083871206563, ]; for num in input_nums: if miller_rabin(int(num)): newfile.write('%(num)s,\n'%{'num':int(num)}); print(num); print('\n')
Если не работает xrange - можно заменить его на range.
Тест проверяет числа довольно быстро, даже большие. Нашел где-то 50 простых чисел длиной 2048 бит из 50000 нечётных, порядка 10^616. Если надо случайное число заданной битности или из диапазона - можно ещё задать или сгенерировать n, и от него уже плясать, в пределах 70 миллионов.
>>38630 Двумя битами можно кодировать степень двойки в порождателе инфы, для дальнейшего перебора всех вариантов от 0 до 2^1. на вход: 1 бит -> 0, 1 степень двойки: 2^0 = 1 -> в порождателе - все комбинации одного бита: 0, 1 степень дойки: 2^1 = 2 -> в порождателе - все комбинации двух битов 00, 01, 10, 11
И мне почему-то кажется, что при помощи простых чисел, можно представить любую уникальную комбинацию бит на каком-либо определённом секторе жесткого диска. Но времени и вычислительных ресурсов, на упаковку уйдёт дофига, потому что - факторизация. Но если сектор делить на 64-битные числа, а потом факторизовать эти числа, или если весь сектор рассматривать как одно число, и найти делители его, то запись простых делителей будет если не меньше, то даже больше - битовой строки самого числа. Поэтому, можно было бы использовать список простых чисел, и сохранять только индексы их.
К тому же, наверняка - есть алгоритмы, способные быстро рассчитать N-ное простое число - по индексу, а также значение пи-функции от произвольного натурального (то есть индекс ближайшего простого - Meissel–Lehmer algorithm), ну - чтобы не хранить сами простые числа. Но я проверил, и вольфрам-альфа, успевая отвечать браузеру по сети - быстрее считает пи-функцию, чем программа c вот этим алгоритмом: http://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.generate.primepi И хотя алгоритм и подвисает, но это намного быстрее, чем прочёсывать все простые числа по каким-то базам данных и диапазонам.
>>38648 >можно было бы использовать список простых чисел, и сохранять только индексы их. Даже не индексы, а смещения индексов. Ведь они возрастают, как и сами числа: Prime factorization: 5×7×11×29×199×1213×5477×1160608367×316134229883×323004876255732144171530186386683923776150893770761 Простые числа, на которые факторизуется составное число - возрастают существенно, а вот индексы - не очень. К тому же, с ростом значения диапазона натуральных - количество простых чисел в диапазоне убывает. Процент простых чисел в натуральных - наглядно видно здесь: >>38589, на второй картинке. Таким образом, если у числа много одинакоых простых делителей можно записать степень, либо индекс простого, и нули за индексом. И эти нули потом, если их много - проще ужать потом ещё и архиватором. Дальше уже - не индекс, а смещение индекса относительно индекса предыдущего простого.
>>38651 Так и есть. Арифметический архиватор принципиально невозможен. Это как нарушить закон сохранения. Но если ОП не верит, пусть попробует. Я когда-то пробовал: и с простыми множителями и с их индексами - в большинстве случаев "сжатый" результат будет больше исходных данных.
>>38653 Как ты в потоке отличишь [0, 1] от [01]? Нужен еще один бит, чтобы указать, когда там однобитный архив, а когда двухбитный, иначе будет неопределенность.
>>38653 Этот способ кодирования используется по другому: если первый бит 1, то после него один бит сжатых данных. Если первый бит 0, то если второй бит 1, то после него джва бита сжатых данных. Если первый бит 0, второй бит 0, третий бит 1, то после него 4 бита сжатых данных и т.п. 1[0..1] 01[00..11] 001[0000..1111] ... Потом составляется частотная таблица для каждого байта исходных данных и наиболее часто встречающимся байтам назначаются наименее длинные коды. Два байта, которые встречаются чаще всего будут иметь размер по два бита каждый. Следующие 4 байта по частоте будут 4 бита в длину. А наименее частые байты будут иметь длину в несколько байт. Если данные не рандомны (т.е. частота всех байт не одинакова), то результирующий архив будет меньше исходных данных.
>>38655 Чё-то я не пойму как разжать, твоими условиями - вот это двоичное число: 01101100000111
Оно было получено так... Исходное двоичное значение: 1001010011101010100111 по два бита его бью: 10 01 01 00 11 10 10 10 10 01 11 Видно, что наиболее часто встречаемые комбинации бит - это 10 и 01. Затем - кодирую их 1 битом: f(0) = 10, f(1) = 01, f(01) = 00, f(10) = 11. После, пропускаю через функцию этот массив где входное значение - по два бита: 0 1 1 01 10 0 0 0 0 1 11 И получаю: 01101100000111
Теперь, пытаюсь его разжать твоими условиями: >если первый бит 1, то после него один бит сжатых данных. >Если первый бит 0, то если второй бит 1, то после него два бита сжатых данных. >Если первый бит 0, второй бит 0, третий бит 1, то после него 4 бита сжатых данных Читаю самого начала это число: Первое условие - false. Первый бит не 1. Второе условие - true (ну 0 и потом 1, значит - два бита после нуля): 0 1 1 Ок. Дальше... 01 10 - тут срабатывает второе условие, и оно должно бы дать 0 1 1 (что неправильно), это если от нулевого бита два бита считать, как выше. Либо же, выше, второе условие должно было бы дать 0 1 10 (если два бита - после единицы, что тоже неправильно). Ну и дальше уже - всё поехало...
На картинке видно наверху, что буква 15 повторений буквы А (в некоем тексте ААААБВВГВБДДДАААААГБВД) - кодируются одной буквой А, числом 15, и нулём, а сама буква заносится в таблицу, а при этом, к ней - кодирует дерево Хаффмана. А сам текст - код Хаффмана. На картинке видна суммация. Буква А - повторяется в тексте 15 раз, поэтому, путь к ней, в дереве Хаффмана, как к наиболее повторяемой букве - записывается нулём.
После этого, составляется таблица, с тремя битами на букву: Символ: | Код: А | 0 Б | 100 В | 101 Г | 110 Д | 111 Почему не двумя - не пойму, видимо, потому что букв 5 и число 5 кодируется тремя битами 101. Видно, что может присутствовать некая контрольная сумма, в виде числа 39, кодирующая всю таблицу. При этом, 39 = 15 + 7 + 6 + 6 + 5 - частоты всех букв. И от этого числа, можно отнимать повторения: 39 - 15 = 24. В общем виде, текст ААААБВВГВБДДДАААААГБВД - кодируется кодом Хаффмана, таблицей с деревом Хаффмана, а также контрольной суммой, от которой надо отнимать повторения каждой буквы из таблицы.
>>38655 >Если данные не рандомны (т.е. частота всех байт не одинакова), то результирующий архив будет меньше исходных данных. Ты говоришь, что данные не должны быть рандомыны, и что там должны быть обязательно повторения. Но взять вот например какой-нибудь шум, например белый свет. Он разлагается на спектр различных цветов. Если разложить рандом "по цветам" байтов, можно получить множество секвенций с множеством нулей, и эти нули потом - ужать. Обратная распаковка - восстановление нулей, сборка секвенций - и сбор их множества в композицию.
>>38667 >Чё-то я не пойму как разжать, твоими условиями Потому что сжимаешь своими условиями. А разжать ты их не сможешь, потому что при кодировании создаешь неопределенность.
>f(0) = 10, f(1) = 01, f(01) = 00, f(10) = 11 это compress-only архиватор. Таким алгоритмом потомкам можно википедию сжать, пусть поебутся, чтоб не скучали.
>>38668 >можно получить множество секвенций с множеством нулей, и эти нули потом - ужать Если говорить про биты, то ты увеличишь данные в восемь раз. Причем нули там будут непоследовательно (в основном), а поэтому сжать более, чем в восемь раз не получится.
>>38669 Неопределённость можно было бы использовать при наличии вычислительных мощностей, например, если есть быстрый квантовый компьютер. Закодировал одним битом два состояния f(1) = 01, f(01) = 00, прицепил хеш полного файла, и всё. Мне чё-то кажется, что даже при указании одной лишь длины файла количество коллизий резко уменьшится.
>>38670 Ишь ты какой? Ты откуда про мои 8 байт узнал? Помнишь небось... Байты брал отсюда: https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h 10 в калькулятор не поместилось, поместилось поэтому, поместилось лишь >восемь. Я пришёл к единичной матрице: e1 -> 1 0 0 0 0 0 0 0 90 -> 0 1 0 0 0 0 0 0 e7 -> 0 0 1 0 0 0 0 0 81 -> 0 0 0 1 0 0 0 0 c7 -> 0 0 0 0 1 0 0 0 bd -> 0 0 0 0 0 1 0 0 05 -> 0 0 0 0 0 0 1 0 90 -> 1 0 0 0 0 0 0 1 и уже вижу избыточность. Да, не учёл, ведь байты всё-равно придется писать в таблицы, и будет столько же таблиц, сколько и было байт.
Но можно ещё так попробовать - разложить значение байта в степенной ряд двойки, и записать смещения позиций у показателей в степенях. например, байт FF(16) = 255(10) = 11111111(2) = 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 показатели степени: 01234567 смещения текущего относительно предыдущего: 11111111 - похоже, что это же число получается... А теперь смещения, относительно процесса увеличения степени предыдущего - на единицу... 00000000 - нет смещений сверх единицы.
Возьму другое число: 90(16) = 144(10) = 10010000 = 10000000 + 10000 = 2^4 + 2^7. Беру показатели степени двойки 4 и 7, и считаю отступы текущего от предыдущего. 4 - 0 = 4; 7 - 4 = 3. Пара чисел 4 и 3 может быть записана как 100 и 11 и это - 5 бит. Но если указать отступ позиции, где есть единица - с учётом процесса увеличения показателя степени на единицу, то... 0,3,2 = 0 11 10. Первый ноль обязательно писать, ведь 2^0 = 1, и эта единица может либо прибавляться к числу, либо нет.
Развётка байта - в обратном порядке: 0 11 10 0. 2^0 = 1 - единицу не прибавляем. +1 к текущему показателю. 11 = 3. 2^((+1)+3) = 2^4 = 10000 -> x. Прибавляю ещё единицу к показателю. 11 = 3. 2^((4+1)+2) = 2^(5+2) = 2^7 + x -> x = 10010000. 7 степень достигнута - следующий байт.
Интересно, если поксорить рандом или уже сжатый и несжимаемый код - сам с собой, можно снизить уменьшить энтропию и потом ещё ужать? Или можно ли каким-то хитромудрым образом, вот той программой для денормализации файлов - подобрать такой ключ, который выдаст преобразованный файл - с наименьшим числом единиц?
>>38674 Можно посчитать количество единиц в файле или битовой строке, затем сравнить с половиной длины файла, и если единиц больше половины длины этого бинарного кода - то сделать инверсию всего кода, а потом дописать лишь один бит, символизирующий её и ужать все те нули, образовавшиеся там, где было дофига единиц. Если сделать так много раз, то я думаю можно было бы уменьшить энтропию и свести код 01110111110 к какому-то такому 10001000001, а потом расписав его в степень двойки так: 10000000000 (2^10) + 00001000000 (2^6)+ 00000000001 (2^0)= сохранить только показатели 0, 6, 10 или их смещения относительно друга 0, 6, 4.
Или представить длинное большое число, как сумму двух простых, согласно бинарной проблеме Гольдбаха, а сами простые числа - сжать как PrimeGrid, сделав из них чётные, и разделив дофига раз на два, например.
>>38453 >Наверняка и числа вида 8n-1 можно как-то разложить. Если p - простое число, и p = x^3 - y^3, где x и y - натуральные числа, то x > y, и имеем, p = x^3 - y^3 = (x - y)(x^2 + xy + y^2), - тут раскрыта разница кубов. Так как здесь, второй сомножитель больше первого, то должно быть x - y = 1, и (x^2 + xy + y^2) = p; откуда, p = x^3 - (x - 1)^3 = 3x^2 - 3x + 1. Таким образом, простое число p, является разницей кубов двух натуральных чисел, тогда и только тогда, когда оно имеет вид 3x(x - 1) + 1, (в этом выражении - 3x вынесено за скобку) где x - натуральное число. И ещё, из двух последовательных чисел x - 1 и x - одно из них, всегда нечётное. Следовательно, простое число должно быть вида 6x+1.
Поэтому, для некоторых 6x+1, а именно - для всех, имеющих вид p = 3x(x - 1) + 1; возможно разложение на разность двух кубов: p = x^3 - y^3 при этом, x - y = 1, и не обязательно записывать y битами, достаточно записать лишь x. Корень кубический от числа - в три раза короче записи числа. 919 = 18^3 - 17^3; 18-17 = 1; 1110010111(2) = 919(10); 10001(2) = 17(10); и этого числа y - достаточно, чтобы выразить x, + 1 бит.
Можно также, разложить любое большое натуральное число - на сумму восьми кубов, и записать только корни кубические от кубов этих.
Есть даже алгоритм рассчёта кубических корней в столбик, при достаточно больших числах (ну, если брать целый сектор например и представлять как одно большое число): Вот этот алго: https://ru.wikipedia.org/wiki/Кубический_корень#Столбиком После вычисления корня - нужно также проверить является ли корень кубический - целым числом, а затем включить алгоритм Миллера-Рабина - и провести тест простоты для корня. Когда 8 корней записано - указывается считается длина бит большего корня, и на каждый последующий корень - выделяется столько же бит. Но 1 корень кубический - ужимает число в три раза, а 8 корней, записанных в виде бит, подряд - не думаю что дали бы меньшую длину битовой строки...
Например, число: 8945 = 1 + 8 + 27 + 125 + 343 + 1331 + 2197 + 4913 = 1^3 + 2^3 + 3^3 + 5^3 + 7^3 + 11^3 + 13^3 + 17^3. 10001011110001 (2) = 8945(10) 1|1 10|2 11|3 101|5 111|7 1011|11 1101|13 10001|17 и биты корней кубических, вместе взятые - намного больше места занимают, чем биты самого числа.
При наличии быстрого алгоритма для рассчёта прайм пи-функции - можно было бы использовать вместо чисел - только индексы простых чисел (как минимум 7 из них - простые, ведь) и кодировать только интервалы между этими индексами, ну потому что корни кубические эти, в ряду суммы кубов - располагаются по возрастанию.
>>38681 >можно было бы использовать вместо чисел - только индексы простых чисел Все равно результат будет занимать больше места, чем само число. Натуральные числа - это и есть сжатое наилучшим алгоритмом множество произведений простых чисел.
>>38687 Я так и понял, что в сумму кубов двоичное число не сжать.
>>38675 >степень двойки >>38675 >сохранить только показатели 0, 6, 10 или их смещения относительно друга 0, 6, 4. Показатели степени ряду суммы степеней двойки - тоже не сжимают. Наглядно - вот: Есть строка: 1001001001100011100011001000010011100101000010110010000111010111 с десятичным числом 10548429254638117335, и внутри неё 28 единиц. В ряд суммы степеней двойки раскладываю всё это: читаю с конца, и пишу: 1×2^0 + 1×2^1 + 1×2^2 + 0×2^3 + 1×2^4 + ... Там где бит единица - и множитель для степени 1, пишу только показатель степени, где множитель 0 - пропускаю, показатель не пишу. Получаю массив степеней двойки для единичных бит: [0, 1, 2, 4, 6, 7, 8, 13, 16, 17, 19, 24, 26, 29, 30, 31, 34, 39, 42, 43, 47, 48, 49, 53, 54, 57, 60, 63] Так как показатель растёт - то смещения текущего показателя степени относительно предыдущего: 1-0, 2-1, 4-2, и т. д - в массив: [0, 1, 1, 2, 2, 1, 1, 5, 3, 1, 2, 5, 2, 3, 1, 1, 3, 5, 3, 1, 4, 1, 1, 4, 1, 3, 3, 3] Дальше, смещения относительно процесса заполнения бит (при заполнении +1). Все числа снижаются на единицу, появляется много нулей. [0, 0, 0, 1, 1, 0, 0, 4, 2, 0, 1, 4, 1, 2, 0, 0, 2, 4, 2, 0, 3, 0, 0, 3, 0, 2, 2, 2] Битовые представления числел в массиах - много места занимает, и проще - битовая строка. Так, для максимального числа 4 - количество бит, чтобы его выразить равно трем: 100 3*28 единиц = 84 бита, что больше, чем просто - 28 единиц.
И да... В последнем массиве вот что получилось... В битовой строке: 1001001001100011100011001000010011100101000010110010000111010111 эти числа - не что инное, как количество нулей, после каждой конкретной единицы, если читать строку - с конца: 1, затем ещё 1 и между ними - ноль нулей. 0 1, затем ещё 1 и между ними - ноль нулей. 0 1, затем ещё 1 и между ними - ноль нулей. 0 1, затем ещё 1 и между ними - один ноль. 1 1, затем ещё 1 и между ними - один ноль. 1 1, затем ещё 1 и между ними - ноль нулей. 0 1, затем ещё 1 и между ними - ноль нулей. 0 седьмая единица с конца - 1, затем ещё 1 и между ними - 4 нуля. 4 0, 0, 1, 1, 0, 0, 4, и так далее.......... Это значения массива.
Можно было бы снизить количество единиц негацией блоков строки, с наибольшим количеством единиц, дописав бинарный код с количеством бит, равным количеству блоков. Например 500 байт, половина из них подвергнута негации, и строка из 500 бит дополнительно, к ним, в которой биты 1 и 0 соответствуют тому, значение ли байта тут или его инверсия. И когда количество единиц снизится, можно использовать префиксный код, сжимающий нули.
Но я смотрю в другое... Я нашёл алгоритм поиска корня n-ной степени: https://ru.wikipedia.org/wiki/Алгоритм_нахождения_корня_n-ной_степени И наверняка, можно было бы, большое число - разложить на корень n-ной степени или сумму этих корней, указав основания и показатели. Получилось бы нечто вроде чисел из PrimeGrid MegaPrimes: http://www.primegrid.com/primes/mega_primes.php Причём чисел, вида: 1806676×41^1806676+1 или 356926^524288+1, в которых достаточно большой показатель. Но так записываются там только простые числа, и я не вижу какой-либо закономерности в простых числах вида. x^524288 + 1, или x^n+1 в общем... Поэтому не знаю, даст ли произвольное длинное число, представляющее из себя сектор на диске, какое-либо разложение на корень n-ной степени, или сумму их, или произведение его с каким-либо небольшим числом.
>>38731 >Поэтому не знаю, даст ли произвольное длинное число, представляющее из себя сектор на диске, >какое-либо разложение на корень n-ной степени, или сумму их, >или произведение его с каким-либо небольшим числом. Некоторые, конечно же, дадут. Но по отношению ко всем 256512 числам, которые может представить сектор на диске, их число будет ничтожно мало. Все же остальные будут "сжиматься" таким способом крайне неэффективно (станут намного больше самого исходного числа).
>>38751 То есть ты намекаешь на длинный остаток. Как например: 1100001 = 1000000 + 100001 = 2^6 + 100001. Остаток лишь на 1 бит меньше + основание с показателем - всё это ещё больше бит занимают, чем число. Ок... Но я говорил - о переборе оснований, чтобы представить число минимальнейшим образом. Так, например, по ссылке выше, можно видеть степень основания больше двух.
Если только простые числа, а не все натуральные - можно представить также коротко, как в PrimeGrid MegaPrimes, через корень n-ной степени, то по бинарной проблеме Гольдбаха, можно было бы взять целый сектор, в качестве простого числа, затем, разделить его на два, как огромное большое число, после этого, включить алгоритм Миллера-Рабина в диапазоне от половины, до плюс-минус 70 миллионов чисел. Итан Чжан показал, или даже доказал, что интервал между простыми числами не может быть более 70 миллионов, если конечно это не тот диапазон с факториалами, речь о котором выше. Таким образом, в пределах 70-ти миллионов натуральных, от половины значения сектора - можно найти как минимум два простых числа. Дальше, найденное простое число - отнимается от сектора, и результат тоже проверяется на простоту алгоритмом Миллера-Рабина. Если результат - число не составное, сектор предствляется суммой простых чисел. А вот уже простые числа - наверняка можно ужать в корень N-ной степени, причём какими бы большими они не были. Или же, представить их - через праймориал.
>>38757 >Итан Чжан показал, или даже доказал, что интервал между простыми числами не может быть более 70 миллионов, Нет. Он доказал, что есть бесконечное число пар простых чисел, между которыми не более 70 млн составных. Это просто приближение к доказательству вроде пока недоказанной гипотезы, что существует бесконечное число простых-близнецов. В принципе же, разрыв между парой простых чисел может быть абсолютно любой.
>>38757 >То есть ты намекаешь на длинный остаток Нет. Я намекаю на то, что натуральный ряд - это уже архив. Там энтропия минимально возможная и сжать его даже на бит не получится. Лишь некоторую ничтожно малую часть этих чисел можно переписать более компактно. Оставшиеся же, перебьют всю сэкономленную память и сверху еще навалят на порядки больше, чем занимало само число.
>>38761 Во всём ряду, может и да, но отдельные числа можно ещё больше сжать. Так, например, натуральное число 18446744073709551614, имеющее бинарный вид: 1111111111111111111111111111111111111111111111111111111111111110 может быть выражено всего двумя битами: 1 и ещё 1 бит, символизирующий инверсию оставшихся 63-х бит. Хочу подчеркнуть, что число натуральное. И таких чисел в ряду - натуральных - много, на каждое из них - можно выделить и по биту, если сжимать нули - многократными прогонами префиксного кодирования.
>>38759 Ну, между простыми числами-близнецами может быть ещё дофига простых чисел разных видов. Я даже проверил - зациклив с рандомного числа алгоритм Миллера-Рабина для каждого конкретного нечётного. И вот что получилось...
Простые числа длиной 1024 бита: 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462464673 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462464889 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462465607 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462465877 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462465897 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462466147 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462466269 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462466317 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462466869 130341454124268511361589671683820282331561282068405574945037046867157404705885569876181968046817776443073022840838404286132626397576976602718965722741926326403746054664615428828902895650047026429699744843338645411810009738677202895562377441140885715679334820178662070173385328005700679135241947932745462467241
Простые числа длиной 2048 бит: 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331659257 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331660187 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331661021 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331667759 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331667767 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331671851 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331676729 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331677107 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331677737 21894522688173756518387509995253958704268650919380741160068056991226576652537628754644264895435856354147612343217117209366305017382894505733026140913413882817495851973374969623377139375449641938210847324176820868735983294429307271769970891706180198116465335419602471925379728494564736572313661243905640883039531280416030435734976123313673612001126259164031919936749302013472219124881546261385713221731806830502862030086331885023727955202834481010696866904774814380192780846179486511261293778786507647997805206107563484930117826257855349238784801300846796108163038193745394400472632071926087475316262676417598331679297
>>38773 Простые числа длиной 4096 bit: 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238409601 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238411059 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238411173 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238412387 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238415627 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238419081 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238421567 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238422191 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238422857 652847511922665051218342821505509360505472799862368633568780170538745984238166668012067318042425171493000391274259624160197650107291873808506689216240034938220221245930032199305948006645670800375358054981521364280623712444472308613777461406892411532021075448168109786072434294667042228646992211867788877495766692398047074302715717236431331194949079884375541133608089357670962195053633600079171675977808957516254418592651994078835346903333766010277887798264226256202944980219028678779858060203957762810913529347040540456105103604408908176444791718619284345489704506301110329022983689819824140988354988806218558891581812927042301282247588981375127638378966037895465948710323067785582924083374083196300144749326784485671226533936478706537934575380366710296906390842785413493838256752655933754149302160673331910960394041675049651633757853497099855509954720284269917359840926699780511948083290338559068928397359556520037318719291214305469977224683963954017831362210405053639986770514860371072137296085841335739070812637304503372574919575902068948992715756760971657107883394344324872799345511368099734406525430574930207642218154379802891909069947879122390885777274022704627660795382619271213806627167783627218483308419889081617252238423281
Как видишь, отличаются они - лишь десятками тысяч. В википедии, в статье про сектор диска - я вижу следующее: Новые жесткие диски используют размер сектора 4096 байт (4 Кбайт), известный как расширенный формат (Advanced Format), и эти числа - как раз длиною в сектор.
И ещё вопрос оставлю тут: Аноны, кто-нибудь знает - как выдрать с исходного кода, отсюда >>38757, по ссылкам внутри там - все фрагменты, да так их закомментировать - чтобы в одном py-файле, работали эти функции: prime(nth), li(x), Li(x) - ну, сдвинутый интегральный логарифм. Или есть ли алгоритм рассчета интегрального логарифма у кого? У меня модули не ставятся и не импортируется нифига - выбивает всякие ерроры... Хотел найти N-ное простое число - и вижу там, отдельным массивом они объявляются эти простые числа: >_list = _array('l', [2, 3, 5, 7, 11, 13, 17, 19, 23]) и после последнего простого числа (тут оно 9-е, у меня) - начинаются траблы с этими функциями li(), log(), Li(), и прочее... Был бы у меня алгоритм рассчёта интегрального логарифма - я попытался бы найти число Скьюза, потому что пи-функция у меня работает локально. Но не вольфрам же дрочить по вебу каждый раз: https://www.wolframalpha.com/input/?i=LogIntegral%5B2%5D хотя там довольно точно рассчитывается этот интегральный логарифм.
>>38039 (OP) Я принёс пи-функцию из 2015-го года: pi(10^27) = 16,352,460,426,841,680,446,427,399 http://www.mersenneforum.org/showthread.php?t=20473 Значений больше - не вижу. МОжно засунуть эти числа в исходник, чтоб быстрее дальше считать? А то не очень хочется перебирать по-новой - столька многа цифар.
>>38773 >>38774 Для длинной последовательности простых чисел, можно записать их в виде разницы между текущим простым числом и предыдущим. Разницу - записать не цифрами а байтами, и на каждое простое число, выражаемое в виде разницы - выделить определённое число байт. По-сути, эта разница кодирует количество составных натуральных до очередного простого. Для получения энного числа, нужно просуммировать все разницы до энного, и прибавить результат к первому простому, записанному в виде числа. Видно, что второе 4096-битное число отличается от первого, также, как отличается 411059 от 409601. 411059 - 409601 = 1458 = 10110110010(2) = 00000101 10110010 - и это два байта. Таким образом, на запись каждого 4096-битного числа может уйти лишь два байта, вместо записи всех цифр каждого числа. 2^4096 = 10^x; x = 1233, то есть 1233 байта/2 байта - сжатие в 616,5 раз. К тому же, в длинном файле с последовательными простыми числами - многие числа могут повторяться, что позволит ещё больше сжать файл - при помощи кода Хаффмана.
>>39121 >>39122 >>39123 >>39124 И всё-же - хреновая идея. Первые 10 миллионов простых чисел занимают 90,1 МБ (94 484 450 байт) если записывать их по 10 чисел через табуляцию со сбросом строки, причём цифрами и в виде ASCII-текста. Если же выделять по одному байту на запись только интервалов, получается 9,53 МБ (10 000 001 байт). И это даже лучшее сжатие, чем ужал первый файл архиватор 7z - он ужал его в 11,9 МБ (12 536 200 байт). Более того, сам текстовый файл с этими однобайтовыми интервалами - тоже можно ужать при помощи 7z, причём до размера 5,18 МБ (5 436 330 байт). Казалось бы, чё бы не использовать однобайтовые интервалы, но... У такой последовательности, от каждого бита - зависит целостность всего файла. Один бит если где-то повреждён, или один бед-сектор если появится - то всё придётся перегенерировать снова. Последовательности, где пишутся все цифры - можно перегенерировать, частично включая алгоритм Миллера-Рабина диапазонами...
Так как для поиска N-ного простого числа по файлу, нужно суммировать последовательно однобайтовые интервалы, процессор от этого греется немало. Но можно конечно засунуть туда через каждые 1000 байт сумму предыдущих 1000, и через каждый миллион - сумму миллиона предыдущих, чтоб ускорить рассчёт. Тогда, можно будет прикрутить и корректирующие коды какие-нибудь, по контрольной сумме, или восстанавливать целые блоки по этим суммам, если где-то повреждён хоть один бит.
>>39916 Что вы тут, скучаете? А я вам - немного факторизации, покушать принёс: Я переписал ρ-метод факторизации Джона Полларда (с оптимизацией от Ричарда Брента). Реализация на JavaScript, адаптированная к BigInteger.js в которой доступны три вариации алгоритма.
Вариант с Brent-оптимизацией - намного быстрее двух предыдущих вариантов, раскладывает тестовое число: 539665377349940636086669695451569769025523026168820293846695597848211 на простые множители: 123457 × 1234577 × 12345701 × 123456791 × 1234567907 × 12345678923 × 123456789133 × 1234567891253 А перебор их занял бы ещё больше времени.
Для более длинных чисел - доступны и другие алгоритмы: >Less than 2^16 or so: Lookup table. >Less than 2^70 or so: Richard Brent's modification of Pollard's rho algorithm. >Less than 10^50: Lenstra elliptic curve factorization >Less than 10^100: Quadratic Sieve >More than 10^100: General Number Field Sieve а также 100%-й метод Ферма, исходник которого - здесь: http://e-maxx.ru/algo/factorization Этот метод очень быстро ищет простые делители длинного числа, но если оно является составным, и состоит из двух рядом лежащих простых чисел. Например, простые числа p и q для генерации числа n по алгоритму RSA.
>>38039 (OP) Я вам тут Javascript-Primality-Tester с генератором подвёз. Может кому надо будет... На клиентской стороне, он без сервера, в браузере - работает с большими числами, при помощи BigInt.js Используется алгоритм Миллера-Рабина с 50-ю раундами.
Засунул туда генератор. Теперь можно генерировать списки последовательных простых чисел - произвольной длины, начиная с произвольного большого простого числа.
Сам я считаю простые числа кодом на python, там тоже Miller-Rabin но с 10-ю раундами. Ошибок не вижу, ориентируясь по сайту https://primes.utm.edu/nthprime/ Рассчёт хоть и на одном ядре (ибо я не смог в векторизацию и параллелизм на GPU), но зато быстрее чем в браузере, и сразу пишет в файл. Скоро закончу генерацию списков простых чисел среди 2-х триллионов натуральных... Первый триллион - находится вот тут: http://www.primos.mat.br/
>>42024 >Скоро закончу генерацию списков простых чисел среди 2-х триллионов натуральных... >Последовательные простые числа, более триллиона, через TOR - тут: https://42k5tcpg7bhjjaze.onion/primes_over_1T/ Второй триллион натуральных чисел рассчитан! Все последовательные простые числа от 1T до 2T - доступны там теперь. От 37607912019-го (1,000,000,000,039) до 73301896139-го простого числа (1,999,999,999,981) было проверено 35,693,984,120 простых чисел. Ошибок не обнаружено. Все эти простые числа - запакованы в 3570 7z-архивов по 10 миллионов простых чисел в каждом. Суммарный объем данных этой части, в сжатом виде - составляет 44,7 ГБ (48 070 309 289 байт). Считал с апреля месяца на одном ядре, процессором.
Сейчас проверяю и пакую числа в диапазоне 2T-3T. Если у кого есть списки простых чисел из этого диапазона, можете залить. Я склею, прогоню и добавлю. Там есть папка FOLDER FOR UPLOADS. Если кто будет заливать, просьба учесть формат. 1. Внутри каждого 7z архива - текстовый файл. Один текстовый файл - миллион строк. 2. По 10 простых чисел в каждой строке. Разделитель между числами - символ табуляции. 9 табуляций. 3. После последнего числа табуляции нет, вместо этого - сброс строки '\r\n' (CRLF) 4. Значение прайм-пи функции от 2Trillions - составляет PrimePi(2T) = 73301896139 - ровно столько простых чисел до двух триллионов. Первое простое число после 2-х триллионов, число 2,000,000,000,003 уже 73301896140-е: https://primes.utm.edu/nthprime/index.php?n=73301896140 10 миллионов чисел в каждой части, если включить первое, то +9,999,999 чисел.
Таким образом, архивы долны иметь следующие оффсеты: ________________________________________________________________________________________ part | first_prime_index | last_prime_index | first prime - last prime | 1 | 73301896140 | 73311896139 | 2,000,000,000,003 - 2,000,283,236,933 | 2 | 73311896140 | 73321896139 | 2,000,283,236,977 - 2,000,566,532,281 | 3 | 73321896140 | 73331896139 | 2,000,566,532,351 - 2,000,849,735,189 | 4 | 73331896140 | 73341896139 | 2,000,849,735,197 - 2,001,133,018,613 | 5 | 73341896140 | 73351896139 | 2,001,133,018,631 - 2,001,416,240,129 | 6 | (last_prime_index_part_5) +1 = 73351896140 | (first_prime_index_part_6)+9,999,999 = 73361896139 | https://primes.utm.edu/nthprime/index.php?n=73351896140 - https://primes.utm.edu/nthprime/index.php?n=73361896139 N | (last_prime_index_N-1)+1 | (first_prime_index_N) | и на сайте видно - числа по индексам. И так далее...
По ссылкам, вы можете получить N-ное простое число, по его индексу, и значение прайм-пи функции в пределах первых 30-ти триллионов натуральных чисел, и триллиона простых. Но списки последовательных простых чисел вы там не качнёте. Поэтому, можно рассчитать first_prime_index для любой части, получить простое число по индексу, и начать с него перебор. Задача рассчета хорошо параллелится таким образом, и можете заливать туда да хоть разные части.
>>42368 >Нахуя это нужно? Чтоб по торрентам раздавать и 4 месяца не брутить их, как поц, очевидно же. >В стронгкрипто используются числа порядка 100^300 >10^300, то есть. Вот здесь можно сгенерировать такие: https://username1565.github.io/Javascript-Primality-Tester/ Только надо подождать, а то долго генерируется... Я сделал это так: 1. >var x = '1'; for(i=1;i<300;i++){x = x+'0';} console.log(x, x.length); 2. start number - это число, numbers - 1. Получил число на 669 больше этого, и оно простое.
>так что твой первый триллион простых чисел никакой роли там не сыграет. Там два триллиона. Ты сночало добейсо. Ещё, с последовательными простыми числами, можно быстро развернуть пёздатейшую скатерть Улама, и вдруг она окажется скатертью-самобранкой? А ещё, простых чисел всего около 1% в природе, среди натуральных. Они диффицитные, и ими можно торговать. И тут - рассчёт простых чисел приравнивается к майнингу, лол. Я уже представляю себе биржи простых чисел, и блокчейн на них.
>>42373 >Попахивает пиздежом. Да так и есть, походу... >Там за простое число из двух миллионов цифр дают миллион долларов, вот анон и готовится. Где там? Смотри какие тут значения в столбце Digits: http://primegrid.com/primes/mega_primes.php >вот анон и готовится Да никуда я не готовлюсь, просто у меня появилось чё-то такая "ПРОСТАЯ ОДЕРЖИМОСТЬ". Процессор 45 ватт всего тянет, в нагрузке, это не так много, вот и решил сюда его флопсы присунуть. Нигде в сети не вижу 2 триллиона, кроме как на сайте https://primes.utm.edu/nthprime/index.php но там нет архивов. Так-то я мог бы и 4 терабайта простыми числами себе забить.
>Алсо, было бы неплохо на основании этих чисел вывести какую никакую >формулу для нахождения простых чисел. >Это я так толсто набросил А действительно, прикинь по двум триллионам - находишь формулу, опережаешь primeGrid, получаешь премию. Но, ИМХО, лучшая формула - это быстрейший алгоритм теста простоты: https://ru.wikipedia.org/wiki/Тест_простоты#Истинные_тесты_простоты Однако куда быстрее можно найти число по смещению, оффсету, нежели проверять перебором все нечётные, не делящиеся на 5, а уж тем более - все натуральные.
Есть ещё алгоритм поиска энного простого числа по интегральному логарифму: >>38648 но он долго работает при значениях овер триллион. Я думаю, что список последовательных простых чисел может помочь отметить опорные точки, или создать массивы для ускорения работы программ, оперирующих простыми числами.
>>42420 Во-первых, я не затачивал списки под быстрый поиск N-ного простого числа - это скорее продолжение списоков с сайта http://primos.mat.br/
Во-вторых, это было не четыре пробела, а символ табуляции \t он же - байт 0x09. Можно его инкрементировать вместе с байтами сброса строки [0x0d, 0x0a], чтобы найти n-ное простое число. Но проще заранее рассчитать крайние значения prime pi-функции для каждого файла, (и можно сделать это быстро, кстати, ибо в файлах по 10 млн чисел), а потом искать N-ное простое число - в конкретном выбранном файле, в пределах входного значения искомого N.
В-третьих, можно было бы и выделить по определённому числу байт на каждое простое, и пропускать их пачкам при поиске, например - секторами, но придётся перепаковывать всё, и я не особо хочу заниматься этим (даже планировать), ведь там овер 3к архивов и я уже хеши их обсчитал.
Если есть конкретные предложения для более удобной организации всего этого - пишите, рассмотрим. Или качайте и запиливайте у себя уже сами...
Поначалу, я думал сжать все эти числа, используя: https://ru.wikipedia.org/wiki/Интервалы_между_простыми_числами Но тогда, при поиске N-ного простого, все эти интервалы пришлось бы суммировать, от начала до конца файла... В этом случае, если целостность файла нарушена хоть на один бит (появился битый сектор, например), то вся конструкция станет не рабочей.
Поэтому, было решено оставить числа даже не в виде байт, а именно в виде ASCII-текста, то есть в виде читабельных списков, как изначально и было в файлах на сайте http://primos.mat.br Ну и 7z достаточно хорошо их жмёт.
>>42580 Заебало, короче, считать онион домен - garlic на одном ядре целый месяц собрался рассчитывать... Кулер свистит и пердит.
Зато нашёл быстрый генератор последовательных простых чисел.
Чтобы получить списки как на как на http://primos.mat.br/ 1. Надо скачать PARI/GP (Pari64-2-11-0.exe) https://pari.math.u-bordeaux.fr/download.html 2. Установить его. 3. Запустить gp.exe с правами администратора. 4. Переключить раскладку на Еnglish (EN) 5. Вставить туда - это (одна строка!): >folder="C:\\Pari64-2-11-0\\data";blockname="2T-3T";part=424;n=0;s="";forprime(p=2119935706183,3000000000000,n++;s=Str(s,p,if(n % 10 != 0,"\t","\n"));if(n % 10^3 == 0, write1(Str(folder,"\\",blockname,"_part",part,".txt"),s);s="");if(n%10000000==0, part++));
В этой строке нужно указать два параметра - номер части (part) и первое простое число в ней (p). Первое простое число может быть рассчитано просто, потому что PrimePi(2T) = 73,301,896,139, и +10 миллионов простых чисел в каждой части. Поэтому (73,301,896,139+1) + (424-1)×10,000,000 = 73,301,896,140 + 4,230,000,000 = 77531896140 - и это число N для первого простого в части 424. Затем, может быть доступно и само простое число, как N-ное простое здесь: https://primes.utm.edu/nthprime/index.php?n=77531896140 и оно имеет значение 2,119,935,706,183 (2119935706183). Это простое число, как результат, может быть использовано как параметр p и так для любой произвольной части.
В результате, может быть сгененрировано множество частей в различном порядке, и эта работа может быть распараллелена с использованием множества компьютеров процессоров и ядер, а также с последующим сравнением хешей всех этих частей.
Каждая часть на выходе - содержит 10 миллионов простых чисел - 10 в одной строке через разделитель '\t' (0x09), и миллион строк в каждой части, через разделитель '\n' (0x0d, 0x0a).
Для быстрой упаковки множества txt-частей -> в архив, с помощью 7z, может быть использован bat-файл, с кодом: >for X in ("full_patheway_for_folder_with_txt_parts\*.txt") do "full_pathway_to_7z_folder\7z.exe" a "~nX.7z" "%%X" В этом случае будет создано много 7z-архивов, рядом с txt-частями.
Pari/GP даёт мне на выхооде части с одинаковыми SHA512 и контрольная сумма СRC-32 внутри 7z файла тоже совпадает. но PARI/GP генерирует части быстрее моего алгоритма. Но это не GPU программа - она использует процессор.
>>43158 >2999999999933 >2999999983949 >между числами 2999999999933 и 3000000000013 есть ещё одно Завязывал бы ты с простыми, от них кукухой можно двинуться. >>11687-кун
>>43159 Оо, внатуре! Перегенерировал - и всё норм. С третьего - по четвёртый триллион теперь считаю, пока мы в параллель тут, из клопа - циклопа на сишке пилим: Охуенно быстро генерирует. Знакомьтесь Сlang - Consecutive Lists Of Primes: ttps://github.com/username1565/cyclop
>>43265 Ну хочь - форкни, откомпиль, да сам повешай клопа своего. Я там батник сунул и описание компиляции. У меня же - циклопом прога будет зваться. Он таким няшный на windows 8.1 в больших значках смотрится...
Есть число 420599303587838138310567954368696889132078473300110593927087135329323325211067643992189 Надо разложить на простые множители Известно: 1)Их два 2)Число вида (2p-1)(2q-1) где p и q простые
Число так же равно 8576682859183712660439494656457(2^185) + 60149540478113987615*(2^92) + 29235325 Мне кажется я близок хэлп