Message boards :
Cafe :
Оптимизация программы
Message board moderation
Previous · 1 · 2 · 3 · 4 · 5
Author | Message |
---|---|
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Моя новая идея, к сожалению, ничего не дала. Думаем дальше. gris, с меня шампанское, а с вас новая оптимизация :) |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Окончательно объединила свою оптимизацию и оптимизацию gris. Результат 56466062592182336298659: [0,18,24,48,54,60,84,90,108] end time = 14min, 50,423 ms. Это уже точно в два раза ускорена программа. Ура! Ещё есть м-а-л-е-н-ь-к-а-я идейка. Сейчас попробую. Если кранчер будет считать на хорошем компьютере, у него программа будет выполняться 3-5 минут. Моя черепашка - тихоход. Производительность у неё 2,4 Ггц. Маленькую идейку уже запустила в работу, жду, что черепашка покажет. Тьфу ты, ничего не дала маленькая идейка. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
gris, а посмотрите, пожалуйста, программу от Deepseek. Опубликована здесь https://boinc.progger.info/odlk/forum_thread.php?id=327&postid=17514 Интересно же, что он там наоптимизировал :) Это китайский ИИ. У меня никак руки не дойдут. Зашиваюсь с обработкой результатов проекта. Да ещё и Ахиллесы тоже ведь подбрасывают результаты. Им тоже надо программы перезапускать, чтобы они не простаивали. К Алисе в гости сегодня ещё не ходила. А с ней интересно побеседовать :) Вдруг какая-никакая идея да и появится у неё по оптимизации. Мне очень нравится её активный такой подход, она моментально бросается в бой и начинает оптимизировать. Нет, ей лучше какие-нибудь конкретные вопросы задавать, не такие широкие, как полная оптимизация программы. Вот надо попробовать дать ей программу от Deepseek и попросить найти ошибки, чтобы программа работала. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Применила подсказку Макса из сообщения 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 штук. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Алиса в программе от 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) ])); |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Удивительно, но Алиса помогла понять последнюю ошибку в программе от Deepseek. Запустила программу и она работает! Пока ничего не выдано. Интересно, сколько времени будет работать эта оптимизированная ИИ программа? И найдёт ли она центральную 9-ку. Вообще, конечно здорово! Я даю Алисе сразу всю программу и ошибку, которая у меня в консоли вылезла. За несколько секунд разобраться в довольно большой программе и понять ошибку - это хороший результат ИИ. Я её похвалила. Она обрадовалась :) Она написала так: "Спасибо, что похвалила, мне приятно." Кстати, Алиса сразу улавливает пол (мужской, женский), если в сообщении применяются глаголы, по которым можно понять. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Вот смотрите, из консоли (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-ки до сих пор нет, а она почти сразу должна выпрыгнуть. Похоже, что эта программа будет работать не быстрее исходной, а намного медленнее. Такая вот оптимизация от китайского ИИ! |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Алиса нашла ещё одну ошибку в коде! Прервала программу, которая всё ещё работала, исправила ошибку и запустила снова. Ошибка это была такая, которая не диагностируется. Вот как! Продолжаю беседовать с Алисой. --------- Нет, исправление ошибки не помогло; программа всё работает, центральная 9-ка не появилась, новые ошибки не вылезли. Ой, только отписалась и вот - (13:31) gp > \r 15_61_0period_boinc_Deepseek.txt Сгенерировано комбинаций: 68913152 time = 21min, 7,727 ms. Центральная 9-ка не найдена. Время на 7 минут меньше времени моей исходной программы. Однако, ускорение имеется. Только центральная 9-ка потеряна; значит, и центральные 11-ки, и 13-ки могут быть потеряны. Хорошо, если центральные 15-ки не потеряются. Теперь важно понять, за счёт чего ускорение. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Публикую программу от 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 может и не быть. Но не факт, что ускорение получено только из-за порядка проверки. У него там есть ещё какая-то предварительная проверка по простым модулям. Особо не вникала. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Вот интересный фрагмент \\ Флаг пропуска 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, и это была ошибка. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Интересно: спрашиваю Алису Вот этот фрагмент \\ Флаг пропуска 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 минут |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Ох! Крутила-вертела программу от 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-ка нашлась. |
![]() ![]() Send message Joined: 6 Apr 17 Posts: 16403 Credit: 0 RAC: 0 |
Ну, слава Богу, в теме gris оптимизация моей программы, кажется, закончилась. Оптимизация была для кого? Для gris, которому она абсолютно не нужна. Ах, да ещё для "триумвирата". Ядряра писал Это не балабольство, в триумвирате я тексты программ показываю. В том числе для тестирования. Интересно: а "триумвирату" оптимизация моей программы сильно нужна? По-моему, нужна, как собаке пятая нога. Программа поиска центральных 15-к у "триумвирата" имеется, причём работающая в 2000 с лишним раз быстрее моей. Так зачем ему моя программа? А-а-а, наверное, для того нужна, чтобы постичь всю гениальность оптимизации Ядряры! Как же я сразу не догадалась! :)) Там, в "триумвирате", небось и овации гремят. А в теме тишина. Благостная тишина. Тьфу-тьфу-тьфу, как бы не сглазить! P. S. Подтверждение сказанного выше цитата из письма gris Неинтересно мне узнавать о ускорении программ, к которым я не имею отношения. Беру пример с Профессора. ВотЪ! Так зачем же он постил мою программу и просил оптимизировать? Гений Ядряра не понимает! Объясняю: чтобы великие кортежисты и программисты мира по-человечески отнеслись к просьбе. |
©2025 (C) Progger