LINUX.ORG.RU

[c++][mysql] Программный запуск сервера

 ,


0

0

Молю сообщество ЛОРа! Помогите решить проблему. Суть такова. Есть структура:

<PRIME>
<PR>простое число P</PR>
<TETTA>
// список примитивных элементов
<TE>примитивный элемент</TE>
  ...
</TETTA>
<DIVISION>
//Список делителей числа P-1
<DIV>делитель числа P-1</DIV>
</DIVISION>
</PRIME>
Хочется иметь таблицу в mysql с подобной структурой и проблема не в этом. 1) Хочу чтобы программа при старте запускала из программы процесс мускула. Хотелось бы чтобы без екзешников, а допустим висел какой-нить длл что-ли. 2) И чтобы можно было настраивать подключение вручную к этому серверу( через какой нибудь диалог) В общем тыкните где читать желательно поуже место, тк я ограничен по времени. А еще лучше мануал где показано как запустить сервак, как его потушить. Благодарю за внимание


amarok2, он вообще с демоном мускула статически связывается (libmysqld.a). можете подсмотреть, как это у них реализовано :)

arsi ★★★★★
()
Ответ на: комментарий от hizel

а можно поподробнее. Чем они так хороши и круче чем мускул. Мускул, то он мускулистый. а это вообще не понятно что. Хотя если вы покажете, что они очень круты я с удовольствием использую их при условии что мне не придется читать многокиллометровых мануалов и доков. Вы не подумайте, я читать очень люблю, но сейчас времени нет.

jeep
() автор топика
Ответ на: комментарий от jeep

тем что они документо-ориентированные, что хорошо ложится на приведенные вами данные :]

hizel ★★★★★
()
Ответ на: комментарий от name_no

Хорошо бы. Но боюсь вы не видите всей задачи, а только ее малую часть. И эта структурка только маленькая часть. А в планах будет несколько таблиц. с записями не менее 10^6. Последовательностей много и разных. Боюсь, что я еще сам не вижу что в конце должно получиться, так что скорее всего после того как я это сделаю придется все переписывать. :(

jeep
() автор топика
Ответ на: комментарий от jeep

Народ, а вообще есть где ниубдь подобная база? Мне до 1000000 простых чисел нужно и факторизация чисел до 1000000 нужна. Если есть такая готовая в любом формате, то дайте ссылочку. Я уже короче устал их генерить.

jeep
() автор топика

> Хотелось бы чтобы без екзешников, а допустим висел какой-нить длл что-ли.

SQLite - возможно то, что тебе нужно.

m0rph ★★★★★
()
Ответ на: комментарий от jeep

если тебе только до 10^6, то стоит подумать, нужна ли вообще база данных?

простых чисел до 10^6 всего 78498. 32-бит на число за глаза хватит. Итого 313992 байта под массив простых чисел. Это не много. Прогони решето Эратосфена. Чтоб сгенерировать их, вряд ли тебе понадобится больше 100 миллисекунд.

Также можно быстро профакторизовать все p-1 простым перебором. Так как как правило p-1 очень гладкие (т.е. (почти) все делители очень маленькие), то и это будет очень быстро. Количество делителей вряд ли будет превышать 14 и точно не будет превышать 20. Отсюда можно сделать оценку, сколько памяти понадобится.

Даже если по какой-то причине надо хранить разложение всех чисел до 10^6, то много памяти всё равно не понадобится. Надо только подумать над структурой данных, которая будет их хранить, чтоб обеспечить быстрый доступ.

Потом можно подумать, а не раскладывать ли числа на лету, по мере надобности? При таких маленьких размерах чисел, вряд ли факторизация займёт больше времени, чем запрос в базу данных.

rha
()
Ответ на: комментарий от jeep

> Народ, а вообще есть где ниубдь подобная база? Мне до 1000000 простых чисел нужно и факторизация чисел до 1000000 нужна. Если есть такая готовая в любом формате, то дайте ссылочку. Я уже короче устал их генерить.

что там их генерить… http://rapidshare.com/files/346679502/prime.dat.xz (7472 KB; 1000000 простых от 2 до 15485863).

arsi ★★★★★
()
Ответ на: комментарий от rha

понял, что читал невнимательно. Надо 10^6 простых чисел, а не простые числа до 10^6. Тем не менее суть не меняется. У меня первые 10^6 простых чисел генеряться в среднем за 200ms.

rha
()
Ответ на: комментарий от rha

Это вы правильно подметили. Только вот тут одна загвоздка. А точнее несколько. 1. Лям простых - это только для начала. 2. Лям простых чисел да на каждое простое простые делители. Да еще короче нужно будет генерить список ВСЕХ Не простых делителей. 3. Да еще ко всему прочему тут нужно будет примитивные элементы к нему и база выйдет немаленькая. Ну вот у меня вопрос. Натолкнулся я на алгоритм Полларда . http://ru.wikipedia.org/wiki/Ρ-алгоритм_Полларда

И там нужно вычеслитьь многочлен x^2+c(mod P), где P - число для факторизации. И тут у меня сразу вопрос - если число уже 1 лям, то в простые типы x^2 уже не влезет. Я правильно понимаю, что тут не обойтись без использования классов для работы с очень большими числами? Среди прочих я нашел Crypto++, который довольно просто использовать включением файла Integer.h . Но нет ли какго-нибудь способа не использовать дополнительные либы и возводить в степень без использования крипто? Ведь если P лям, то квадрат числа х должен быть меньше P.

jeep
() автор топика
Ответ на: комментарий от jeep

> И тут у меня сразу вопрос - если число уже 1 лям, то в простые типы x^2 уже не влезет. Я правильно понимаю, что тут не обойтись без использования классов для работы с очень большими числами?

int64_t. до ≈±9‧10¹⁸

arsi ★★★★★
()
Ответ на: комментарий от arsi

лям простых чисел дает лям чисел для факторизации. Мне нужно факторизовать все 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; Этого за глаза и за уши хватит.

jeep
() автор топика
Ответ на: комментарий от jeep

> Мне нужно факторизовать все P-1 числа. Проблем в поиске простых нету.

ну, без всяких хитрых формул (и без int64_t) на моей машине факторизация лимона P-1 за 8 минут проходит (из них ≈ полторы секунды собственно на поиск лимона P). код нужен?

я только о Tetta непонял, что это и как считать…

arsi ★★★★★
()
Ответ на: комментарий от arsi

тетта - это просто примитивный элемент Элемент примитивный, если при возведении тетта в степени от 0..P-2 по модулю P получаются все элементы поля Галуа. А tetta^(P-1)=1. Ни один квадратичный вычет не может быть примитивным элементом. Собственно я решил, что мне и 10 хватит. Думаю даже это излишне. Я уже высчитал их.

jeep
() автор топика
Ответ на: комментарий от jeep
#include <stdio.h>
#include <malloc.h>
#include <memory.h>

#define MAX_NUM   15485863
#define MAX_COUNT  1000000

int main() {
        int i, j, t, n = 0;
        char *v = (char *) malloc(MAX_NUM);
        int *p = (int *) malloc(MAX_COUNT * sizeof(int));
        memset(v--, 0, MAX_NUM);
        for (i = 2; i <= MAX_NUM; ++i) {
                if (v[i])
                        continue;
                if (n == MAX_COUNT)
                        break;
                for (j = i * 2; j <= MAX_NUM; j += i)
                        v[j] = 1;
                t = (p[n++] = i) - 1;
                printf("%d\t%d\t%d", n, i, t);
                for (j = 0; t > 1; t /= p[j]) {
                        for (; t % p[j]; ++j);
                        printf("\t%d", p[j]);
                }
                putchar('\n');
        }
        free(p);
        free(v + 1);
        return 0;
}
arsi ★★★★★
()
Ответ на: комментарий от arsi

комент к коду:

«printf(«%d\t%d\t%d», n, i, t);» — здесь выводятся: номер P (n), P (i) и P-1 (t);

«printf(«\t%d», p[j]);» выводит очередной делитель P-1 (p[j]).

arsi ★★★★★
()
Ответ на: комментарий от jeep

MAX_NUM — максимальное натуральное число, которое будет проверяться на простоту (там решето Эратосфена используется). указывает сколько выделять памяти под матрицу.

MAX_COUNT — максимальное количество простых (в примере массив под простые выделяется сразу).

в принципе, MAX_* могут быть не синхронизированы — программа заканчивает работу тогда, когда любой из массивов заполнен до предела.

arsi ★★★★★
()
Ответ на: комментарий от rha

> первый цикл по j можно пустить от i*i, тогда чуток быстрее будет.

и делать дополнительную проверку перед циклом на i < (1 << (sizeof(i) * 4 - 1)) ради ускорения на какие-то 50%? :)

а вообще да, спасибо, запамятовал я этот нюанс :(

arsi ★★★★★
()

>без екзешников

длл

внезапно показалось, что я на винфаке

Ingwar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.