Оптимизация программы

Message boards : Cafe : Оптимизация программы
Message board moderation

To post messages, you must log in.

Previous · 1 · 2 · 3 · 4 · 5

AuthorMessage
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17516 - Posted: 31 Aug 2025, 13:45:33 UTC
Last modified: 31 Aug 2025, 13:45:44 UTC

Моя новая идея, к сожалению, ничего не дала.

Думаем дальше.

gris,
с меня шампанское, а с вас новая оптимизация :)
ID: 17516 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17517 - Posted: 31 Aug 2025, 14:06:46 UTC
Last modified: 31 Aug 2025, 14:26:08 UTC

Окончательно объединила свою оптимизацию и оптимизацию gris.

Результат

56466062592182336298659: [0,18,24,48,54,60,84,90,108]

end
time = 14min, 50,423 ms.

Это уже точно в два раза ускорена программа.
Ура!

Ещё есть м-а-л-е-н-ь-к-а-я идейка.
Сейчас попробую.

Если кранчер будет считать на хорошем компьютере, у него программа будет выполняться 3-5 минут.

Моя черепашка - тихоход.
Производительность у неё 2,4 Ггц.

Маленькую идейку уже запустила в работу, жду, что черепашка покажет.

Тьфу ты, ничего не дала маленькая идейка.
ID: 17517 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17518 - Posted: 31 Aug 2025, 14:18:17 UTC
Last modified: 1 Sep 2025, 3:58:55 UTC

gris,
а посмотрите, пожалуйста, программу от Deepseek.

Опубликована здесь
https://boinc.progger.info/odlk/forum_thread.php?id=327&postid=17514

Интересно же, что он там наоптимизировал :)
Это китайский ИИ.

У меня никак руки не дойдут.
Зашиваюсь с обработкой результатов проекта.
Да ещё и Ахиллесы тоже ведь подбрасывают результаты.
Им тоже надо программы перезапускать, чтобы они не простаивали.

К Алисе в гости сегодня ещё не ходила.
А с ней интересно побеседовать :)
Вдруг какая-никакая идея да и появится у неё по оптимизации.
Мне очень нравится её активный такой подход, она моментально бросается в бой и начинает оптимизировать.
Нет, ей лучше какие-нибудь конкретные вопросы задавать, не такие широкие, как полная оптимизация программы.

Вот надо попробовать дать ей программу от Deepseek и попросить найти ошибки, чтобы программа работала.
ID: 17518 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17519 - Posted: 31 Aug 2025, 16:01:10 UTC
Last modified: 31 Aug 2025, 16:01:40 UTC

Применила подсказку Макса из сообщения
https://dxdy.ru/post1700326.html#p1700326


Время уменьшилось примерно на 10 ms.

(18:29) gp > \r 15_61_0period_boinc_mod.txt
56466062592182336298659: [0,18,24,48,54,60,84,90,108]

end
time = 14min, 40,158 ms.

Вычисление обратных элементов выполняется вне цикла и всего один раз.
И их всего 18 штук.
ID: 17519 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17522 - Posted: 1 Sep 2025, 5:42:09 UTC
Last modified: 1 Sep 2025, 5:45:22 UTC

Алиса в программе от Deepseek не смогла разобраться.

На первой же ошибке застряла.
Правда, наклонную черту в комментариях она исправила.

(09:38) gp > \r 15_61_0period_boinc_Deepseek.txt
  ***   at top-level: ...;for(j=1,#pt9,r=(-pt9[j])%p;forbidden=setunion
  ***                                             ^---------------------
  *** _%_: impossible inverse in sdivsi_rem: 0.

Я исправила первую ошибку.
Однако на второй застряла.
Не знаю, что тут за ошибка.

Надо спросить у Алисы.
Вдруг она знает.

Кстати, Deepseek делеает вычисление добавки тоже в цикле без всяких предвычислений

\\ Решаем систему сравнений
bpt0 = lift(chinese([
    Mod(1,2), Mod(2,3), Mod(4,5), Mod(2,7), Mod(9,11), Mod(4,13),
    Mod(rost17,17), Mod(rost19,19), Mod(rost23,23), Mod(rost29,29),
    Mod(rost31,31), Mod(rost37,37), Mod(rost41,41),
    Mod(v43[i43],43), Mod(v47[i47],47), Mod(v53[i53],53),
    Mod(v59[i59],59), Mod(v61[i61],61)
]));
ID: 17522 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17525 - Posted: 1 Sep 2025, 8:46:08 UTC
Last modified: 1 Sep 2025, 8:52:07 UTC

Удивительно, но Алиса помогла понять последнюю ошибку в программе от Deepseek.

Запустила программу и она работает!
Пока ничего не выдано.

Интересно, сколько времени будет работать эта оптимизированная ИИ программа?
И найдёт ли она центральную 9-ку.

Вообще, конечно здорово!
Я даю Алисе сразу всю программу и ошибку, которая у меня в консоли вылезла.
За несколько секунд разобраться в довольно большой программе и понять ошибку - это хороший результат ИИ.
Я её похвалила.
Она обрадовалась :)
Она написала так: "Спасибо, что похвалила, мне приятно."

Кстати, Алиса сразу улавливает пол (мужской, женский), если в сообщении применяются глаголы, по которым можно понять.
ID: 17525 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17526 - Posted: 1 Sep 2025, 8:59:40 UTC

Вот смотрите, из консоли

(09:38) gp > \r 15_61_0period_boinc_Deepseek.txt
  ***   at top-level: ...;for(j=1,#pt9,r=(-pt9[j])%p;forbidden=setunion
  ***                                             ^---------------------
  *** _%_: impossible inverse in sdivsi_rem: 0.
(09:42) gp > \r 15_61_0period_boinc_Deepseek.txt

Сначала показана ошибка. которая вылезла при первом запуске.
Потом ошибка была исправлена и программа снова запущена.
Теперь ошибка не выдалась, но... и центральной 9-ки до сих пор нет, а она почти сразу должна выпрыгнуть.

Похоже, что эта программа будет работать не быстрее исходной, а намного медленнее.

Такая вот оптимизация от китайского ИИ!
ID: 17526 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17527 - Posted: 1 Sep 2025, 9:29:44 UTC
Last modified: 1 Sep 2025, 9:55:23 UTC

Алиса нашла ещё одну ошибку в коде!

Прервала программу, которая всё ещё работала, исправила ошибку и запустила снова.
Ошибка это была такая, которая не диагностируется.
Вот как!

Продолжаю беседовать с Алисой.

---------
Нет, исправление ошибки не помогло; программа всё работает, центральная 9-ка не появилась, новые ошибки не вылезли.

Ой, только отписалась и вот -

(13:31) gp > \r 15_61_0period_boinc_Deepseek.txt
Сгенерировано комбинаций: 68913152
time = 21min, 7,727 ms.

Центральная 9-ка не найдена.
Время на 7 минут меньше времени моей исходной программы.

Однако, ускорение имеется.
Только центральная 9-ка потеряна; значит, и центральные 11-ки, и 13-ки могут быть потеряны.
Хорошо, если центральные 15-ки не потеряются.

Теперь важно понять, за счёт чего ускорение.
ID: 17527 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17528 - Posted: 1 Sep 2025, 10:50:06 UTC
Last modified: 1 Sep 2025, 10:55:05 UTC

Публикую программу от Deepseek с исправленными ошибками, которая теперь работает

default(timer,1);

{pt = [0, 18, 30, 60, 78, 84, 108, 114, 120, 144, 150, 168, 198, 210, 228];

tin = fileopen("in.txt");
  rost17 = eval(filereadstr(tin));
  rost19 = eval(filereadstr(tin));
  rost23 = eval(filereadstr(tin));
  rost29 = eval(filereadstr(tin));
  rost31 = eval(filereadstr(tin));
  rost37 = eval(filereadstr(tin));
  rost41 = eval(filereadstr(tin));
  vivod  = filereadstr(tin);  \\ Считываем как строку
fileclose(tin);

\\ Преобразуем vivod в строку, если вдруг не строка
if(type(vivod) != "t_STR", vivod = Str(vivod));

fout = fileopen(vivod".txt", "a");

k = 0;

\\ Вычисляем M — произведение первых простых
M = 2*3*5*7*11*13*17*19*23*29*31*37*41*43*47*53*59*61;
limit = 2079914861571286679;

\\ Простые от 67 до 1000
primesieve=[];
forprime(p = 67, 1000, primesieve = concat(primesieve, p));

\\ Шаблоны
pt9  = [0, 18, 24, 48, 54, 60, 84, 90, 108];
pt11 = [0, 30, 48, 54, 78, 84, 90, 114, 120, 138, 168];
pt13 = [0,12,42,60,66,90,96,102,126,132,150,180,192];

\\ Векторы остатков
v2=[1];
v3=[1,2];
v5=[3,4];
v7=[1,2];
v11=[5,9];
v13=[2,4];
v17=[12,13,14,15];
v19=[4,5,7,9,10,12,14,15];
v23=[3,4,6,10,12,13,15,19,21,22];
v29=[7,10,12,13,14,15,16,17,18,19,20,21,23,26];
v31=[3,6,8,12,14,17,21,22,23,24,25,26,27,28,29,30];
v37=[1,2,5,6,8,9,10,11,13,15,16,18,20,21,22,23,25,26,29,30,32,36];
v41=[1,2,5,6,8,10,12,13,16,17,19,21,24,25,26,27,28,29,30,31,32,33,34,35,38,40];
v43=[1,3,6,7,10,11,12,14,16,18,19,20,23,24,27,29,31,32,33,34,35,36,37,38,39,40,41,42];
v47=[1,2,3,4,5,6,8,9,11,12,13,14,15,18,19,22,23,24,26,28,30,31,32,35,36,39,40,41,42,43,45,46];
v53=[1,3,4,5,6,7,8,10,11,12,13,16,17,18,19,20,21,24,25,26,27,29,30,31,32,33,34,36,38,40,41,42,43,47,48,49,50,52];
v59=[1,2,3,5,6,7,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,28,30,31,32,35,36,37,39,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56];
v61=[3,4,5,6,7,9,10,11,12,13,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,35,36,37,40,41,42,45,47,48,49,50,51,52,53,54,55,56,57,58,59,60];

\\ Предвычисляем запрещённые остатки для pt9
forbidden9_list = vector(#primesieve, i,
    p = primesieve[i];
    forbidden = Set();
    for(j = 1, #pt9,
        r = (-pt9[j]) % p;
        forbidden = setunion(forbidden, [r])
    );
    forbidden
);

\\ Основной цикл
for(i43 = 1, #v43,
for(i47 = 1, #v47,
for(i53 = 1, #v53,
for(i59 = 1, #v59,
for(i61 = 1, #v61,

k++;

\\ Решаем систему сравнений
bpt0 = lift(chinese([
    Mod(1,2), Mod(2,3), Mod(4,5), Mod(2,7), Mod(9,11), Mod(4,13),
    Mod(rost17,17), Mod(rost19,19), Mod(rost23,23), Mod(rost29,29),
    Mod(rost31,31), Mod(rost37,37), Mod(rost41,41),
    Mod(v43[i43],43), Mod(v47[i47],47), Mod(v53[i53],53),
    Mod(v59[i59],59), Mod(v61[i61],61)
]));

\\ Корректируем bpt
bpt = if(bpt0 < limit, bpt0 + M, bpt0);

\\ Флаг пропуска
skip = 0;
for(i = 1, #primesieve,
    p = primesieve[i];
    r = bpt % p;
    if(setsearch(forbidden9_list[i], r),
        skip = 1; break
    )
);
if(skip, next);

\\ Общая проверка: используем временный вектор
vmy = vector(15);
l = 0;

\\ Проверка паттерна длины 15: от bpt до bpt+228
if(ispseudoprime(bpt) && ispseudoprime(bpt + pt[15]),
    l = 0;
    forprime(p = bpt, bpt + pt[15],
        l++;
        if(l > 15, break);
        vmy[l] = p
    );
    if(l == 15,
        pat15 = vector(15, i, vmy[i] - vmy[1]);
        if(pat15 == pt,
            w1 = strprintf("%d: %d\n", vmy[1], pat15);
            print(w1);
            filewrite(fout, w1)
        );
        \\ Проверка на частичные совпадения
        pat1 = vector(15, i, if(pat15[i] == pt[i], 1, 0));
        vlds = vecsum(pat1);
        if(vlds > 9,
            code = fromdigits(pat1[2..14], 2);  \\ 13 бит
            w1 = strprintf("%d: %d\n%d\n", vmy[1], pat15, code);
            filewrite(fout, w1);
            print(w1)
        )
    )
);

\\ Проверка паттерна 13
if(ispseudoprime(bpt + pt[2]) && ispseudoprime(bpt + pt[14]),
    l = 0;
    forprime(p = bpt + pt[2], bpt + pt[14],
        l++;
        if(l > 13, break);
        vmy[l] = p
    );
    if(l == 13,
        pat13 = vector(13, i, vmy[i] - vmy[1]);
        if(pat13 == pt13,
            w1 = strprintf("%d: %d\n", vmy[1], pat13);
            print(w1);
            filewrite(fout, w1)
        )
    )
);

\\ Проверка паттерна 11
if(ispseudoprime(bpt + pt[3]) && ispseudoprime(bpt + pt[13]),
    l = 0;
    forprime(p = bpt + pt[3], bpt + pt[13],
        l++;
        if(l > 11, break);
        vmy[l] = p
    );
    if(l == 11,
        pat11 = vector(11, i, vmy[i] - vmy[1]);
        if(pat11 == pt11,
            w1 = strprintf("%d: %d\n", vmy[1], pat11);
            print(w1);
            filewrite(fout, w1)
        )
    )
);

\\ Проверка паттерна 9
if(ispseudoprime(bpt + pt[4]) && ispseudoprime(bpt + pt[12]),
    l = 0;
    forprime(p = bpt + pt[4], bpt + pt[12],
        l++;
        if(l > 9, break);
        vmy[l] = p
    );
    if(l == 9,
        pat9 = vector(9, i, vmy[i] - vmy[1]);
        if(pat9 == pt9,
            w1 = strprintf("%d: %d\n", vmy[1], pat9);
            print(w1);
            filewrite(fout, w1)
        )
    )
);

))))); \\ конец циклов

print("Сгенерировано комбинаций: ", k);
filewrite(fout, "end\n");
fileclose(fout);
}

Но программа теряет центральную 9-ку.
Ускорение даёт 7 минут.

Я вижу, чо у ИИ другой порядок проверки кортежей, он начинает проверять с кортежа длины 15.
Именно поэтому, наверное, он теряет центральную 9-ку.
То есть если найдётся центральная 15-ка, в ней будут и все остальные центральные кортежи.
Это понятно, и проверять эти матрёшки уже не надо.

Но моя-то программа ищет центральные 9-ки, 11-ки, 13-ки, которые ещё до центральной 15-ки, то есть центральной 15-ки для этого bpt может и не быть.

Но не факт, что ускорение получено только из-за порядка проверки.

У него там есть ещё какая-то предварительная проверка по простым модулям.
Особо не вникала.
ID: 17528 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17529 - Posted: 1 Sep 2025, 11:03:32 UTC
Last modified: 1 Sep 2025, 11:05:19 UTC

Вот интересный фрагмент

\\ Флаг пропуска
skip = 0;
for(i = 1, #primesieve,
    p = primesieve[i];
    r = bpt % p;
    if(setsearch(forbidden9_list[i], r),
        skip = 1; break
    )
);
if(skip, next);

Это как раз проверка по небольшим простым модулям.

Надо посмотреть внимательнее.

Примечание: имя вектору primesieve дала я; в оригинале вектор назывался primes, и это была ошибка.
ID: 17529 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17530 - Posted: 1 Sep 2025, 13:33:00 UTC

Интересно: спрашиваю Алису

Вот этот фрагмент \\ Флаг пропуска skip = 0; for(i = 1, #primesieve, p = primesieve[i]; r = bpt % p; if(setsearch(forbidden9_list[i], r), skip = 1; break ) ); if(skip, next); мог дать ускорение программы?

Она отвечает

Да, абсолютно — и не просто «мог», а почти наверняка — именно он дал основное ускорение в 7 минут
ID: 17530 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17532 - Posted: 2 Sep 2025, 5:42:10 UTC
Last modified: 2 Sep 2025, 5:44:14 UTC

Ох!
Крутила-вертела программу от Deepseek, дооптимизировалась, ушла в минус


(08:45) gp > \r 15_61_0period_boinc_Deepseek.txt
56466062592182336298659: [0,18,24,48,54,60,84,90,108]

  ***   at top-level: ...[i];r=bpt%p;if(setsearch(forbidden9_list[i],r)
  ***                                             ^---------------------
  ***   user interrupt after 32min, 14,023 ms

С какого-то перепугу программа вдруг нашла центральную 9-ку, которую раньше не находила (то есть теряла).

Ну, и чувствую, что программа уже больше получаса работает, прервала.

А изменила я количество простых модулей, которые программа использует для предвычислений; было в программе от 67 до 1000, я сделала от 67 до 700.

В общем, я так и не поняла, за счёт чего программа выдавала ускорение на 7 минут, с потерянной центральной 9-й.
Поэтому прекращаю дальнейшую оптимизацию этой программы.
Пусть будет ускорение только в два раза, которое мы с gris получили.
Это тоже неплохо.

Примечание: возможно, центральная 9-ка терялась как раз из-за предпроверки малых модулей.
Когда я уменьшила количество проверяемых малых модулей, центральная 9-ка нашлась.
ID: 17532 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Profile Natalia Makarova
Project scientist
Avatar

Send message
Joined: 6 Apr 17
Posts: 16403
Credit: 0
RAC: 0
Message 17533 - Posted: 2 Sep 2025, 5:48:02 UTC
Last modified: 6 Sep 2025, 5:43:14 UTC

Ну, слава Богу, в теме gris оптимизация моей программы, кажется, закончилась.

Оптимизация была для кого?
Для gris, которому она абсолютно не нужна.

Ах, да ещё для "триумвирата".

Ядряра писал
Это не балабольство, в триумвирате я тексты программ показываю. В том числе для тестирования.

Интересно: а "триумвирату" оптимизация моей программы сильно нужна?
По-моему, нужна, как собаке пятая нога.

Программа поиска центральных 15-к у "триумвирата" имеется, причём работающая в 2000 с лишним раз быстрее моей.
Так зачем ему моя программа?

А-а-а, наверное, для того нужна, чтобы постичь всю гениальность оптимизации Ядряры!
Как же я сразу не догадалась! :))
Там, в "триумвирате", небось и овации гремят.
А в теме тишина.
Благостная тишина.
Тьфу-тьфу-тьфу, как бы не сглазить!

P. S. Подтверждение сказанного выше
цитата из письма gris
Неинтересно мне узнавать о ускорении программ, к которым я не имею отношения. Беру пример с Профессора.

ВотЪ!

Так зачем же он постил мою программу и просил оптимизировать?
Гений Ядряра не понимает!
Объясняю: чтобы великие кортежисты и программисты мира по-человечески отнеслись к просьбе.
ID: 17533 · Rating: 0 · rate: Rate + / Rate - Report as offensive     Reply Quote
Previous · 1 · 2 · 3 · 4 · 5

Message boards : Cafe : Оптимизация программы


©2025 (C) Progger