Молю сообщество ЛОРа! Помогите решить проблему.
Суть такова.
Есть структура:
<PRIME>
<PR>простое число P</PR>
<TETTA>
// список примитивных элементов
<TE>примитивный элемент</TE>
...
</TETTA>
<DIVISION>
//Список делителей числа P-1
<DIV>делитель числа P-1</DIV>
</DIVISION>
</PRIME>
Хочется иметь таблицу в mysql с подобной структурой и проблема не в этом.
1) Хочу чтобы программа при старте запускала из программы процесс мускула. Хотелось бы чтобы без екзешников, а допустим висел какой-нить длл что-ли.
2) И чтобы можно было настраивать подключение вручную к этому серверу( через какой нибудь диалог)
В общем тыкните где читать желательно поуже место, тк я ограничен по времени. А еще лучше мануал где показано как запустить сервак, как его потушить. Благодарю за внимание
а можно поподробнее. Чем они так хороши и круче чем мускул. Мускул, то он мускулистый. а это вообще не понятно что. Хотя если вы покажете, что они очень круты я с удовольствием использую их при условии что мне не придется читать многокиллометровых мануалов и доков. Вы не подумайте, я читать очень люблю, но сейчас времени нет.
Хорошо бы. Но боюсь вы не видите всей задачи, а только ее малую часть. И эта структурка только маленькая часть. А в планах будет несколько таблиц. с записями не менее 10^6. Последовательностей много и разных. Боюсь, что я еще сам не вижу что в конце должно получиться, так что скорее всего после того как я это сделаю придется все переписывать. :(
Народ, а вообще есть где ниубдь подобная база? Мне до 1000000 простых чисел нужно и факторизация чисел до 1000000 нужна. Если есть такая готовая в любом формате, то дайте ссылочку. Я уже короче устал их генерить.
если тебе только до 10^6, то стоит подумать, нужна ли вообще база данных?
простых чисел до 10^6 всего 78498. 32-бит на число за глаза хватит. Итого 313992 байта под массив простых чисел. Это не много. Прогони решето Эратосфена. Чтоб сгенерировать их, вряд ли тебе понадобится больше 100 миллисекунд.
Также можно быстро профакторизовать все p-1 простым перебором. Так как как правило p-1 очень гладкие (т.е. (почти) все делители очень маленькие), то и это будет очень быстро. Количество делителей вряд ли будет превышать 14 и точно не будет превышать 20. Отсюда можно сделать оценку, сколько памяти понадобится.
Даже если по какой-то причине надо хранить разложение всех чисел до 10^6, то много памяти всё равно не понадобится. Надо только подумать над структурой данных, которая будет их хранить, чтоб обеспечить быстрый доступ.
Потом можно подумать, а не раскладывать ли числа на лету, по мере надобности? При таких маленьких размерах чисел, вряд ли факторизация займёт больше времени, чем запрос в базу данных.
> Народ, а вообще есть где ниубдь подобная база? Мне до 1000000 простых чисел нужно и факторизация чисел до 1000000 нужна. Если есть такая готовая в любом формате, то дайте ссылочку. Я уже короче устал их генерить.
понял, что читал невнимательно. Надо 10^6 простых чисел, а не простые числа до 10^6. Тем не менее суть не меняется. У меня первые 10^6 простых чисел генеряться в среднем за 200ms.
Это вы правильно подметили. Только вот тут одна загвоздка. А точнее несколько.
1. Лям простых - это только для начала.
2. Лям простых чисел да на каждое простое простые делители. Да еще короче нужно будет генерить список ВСЕХ Не простых делителей.
3. Да еще ко всему прочему тут нужно будет примитивные элементы к нему и база выйдет немаленькая.
Ну вот у меня вопрос. Натолкнулся я на алгоритм Полларда .
http://ru.wikipedia.org/wiki/Ρ-алгоритм_Полларда
И там нужно вычеслитьь многочлен x^2+c(mod P), где P - число для факторизации. И тут у меня сразу вопрос - если число уже 1 лям, то в простые типы x^2 уже не влезет. Я правильно понимаю, что тут не обойтись без использования классов для работы с очень большими числами?
Среди прочих я нашел Crypto++, который довольно просто использовать включением файла Integer.h . Но нет ли какго-нибудь способа не использовать дополнительные либы и возводить в степень без использования крипто? Ведь если P лям, то квадрат числа х должен быть меньше P.
> И тут у меня сразу вопрос - если число уже 1 лям, то в простые типы x^2 уже не влезет. Я правильно понимаю, что тут не обойтись без использования классов для работы с очень большими числами?
лям простых чисел дает лям чисел для факторизации.
Мне нужно факторизовать все P-1 числа. Проблем в поиске простых нету.
Вообще я пробую сделать что-то вроде сериализации.
class CSInt{
typedef int TInt;
typedef vector<TInt> TVInt;
Tint Pr; простое
TVInt Tetta; // список примитивных элементов
TVInt Div; // факторизация Pr-1
public:
CSInt(){}
~CSInt(){}
}
typedef vector<CSInt> TVSInt;
TVSInt ser;
Добавлю туда >> и << и можно будет хранить в файле.
Это спасибо на счет int_64_t; Этого за глаза и за уши хватит.
> Мне нужно факторизовать все P-1 числа. Проблем в поиске простых нету.
ну, без всяких хитрых формул (и без int64_t) на моей машине факторизация лимона P-1 за 8 минут проходит (из них ≈ полторы секунды собственно на поиск лимона P). код нужен?
тетта - это просто примитивный элемент
Элемент примитивный, если при возведении тетта в степени от 0..P-2 по модулю P получаются все элементы поля Галуа. А tetta^(P-1)=1. Ни один квадратичный вычет не может быть примитивным элементом. Собственно я решил, что мне и 10 хватит. Думаю даже это излишне. Я уже высчитал их.
MAX_NUM — максимальное натуральное число, которое будет проверяться на простоту (там решето Эратосфена используется). указывает сколько выделять памяти под матрицу.
MAX_COUNT — максимальное количество простых (в примере массив под простые выделяется сразу).
в принципе, MAX_* могут быть не синхронизированы — программа заканчивает работу тогда, когда любой из массивов заполнен до предела.