За три дня наконец написал на асме x64 подсчёт констант HL1 (в один поток). Сравнение скорости с PARI: для 19-252 подсчёт шести констант (C0-C6, шестикратное загрязнение) занимает 374с, на асме 7с. C11 на PARI считались 11ч52м (вдвое оптимизировано), на асме за 28м, C12 на PARI считались 22ч38м (вдвое оптимизировано), на асме хватило 52м. C15 посчитались за 2.9ч.
А
все 30 - за 4.9ч:
vC=[1592669394.7454967048413543203360474784, 224048612037.93039519376335978164281999, 15060404457776.501117870903945957690526, 643975079051969.03088164442593218519955, 19672864014876028.811392004831387751738, 457178627398399663.18641317636046162635, 8402763498659303975.5096285952058360662, 125377224477963805206.89777938556921101, 1546929025718798946089.7912641404857550, 15994906029871361204769.187564407532779, 139968081763087863869464.29066290148284, 1044156353257761368147093.1368606066768, 6675438285921407673520498.0916226089839, 36708432877688236096050822.004415616758, 174035122935989493790024654.03258975691, 712196947564732599952975315.78320487298, 2515955263037428615471767242.6561789800, 7665777149089072567977478763.2382586304, 20106445874574298344616432170.789792210, 45264384755093882439279790845.152290852, 87100700457132907803880854701.370644633, 142466968404912726214137650877.36926652, 196618531164038126660089156973.85750819, 226702801658738154151893801565.04524662, 215451193980762378792182794368.57516197, 165604812316252926590574664686.92377585, 100155274592395251942807287899.23908798, 45706363430133812262358484887.605564941, 14703144047237460493314662394.499537327, 2942032946247678005083329346.8122466890, 271007079912233354594900744.95914433491]К сожалению обеспечить точность как в PARI не удалось, в C0-C13 верные лишь 19-14 цифр, в следующих наверное и чуть меньше, 11-13, точно не знаю (самые неточные - где больше вариантов грязных паттернов, к концу точность улучшается). Фактически точность принесена в жертву скорости.
Один день из трёх заняли доработки для подсчёта любых паттернов, не только заданного при компиляции. Теперь можно считать любые паттерны (только с чётными числами) длиной до 1000 и диаметром до 2000 с загрязнением до 99 (некритично, просто памяти жалко). Используется из PARI так:
Код:
v=[0,6,12,30,42,72,90,96,120,126,132,156,162,180,210,222,240,246,252];
maxn=99;
BC=vector(#v+maxn,k, if(k<#v, 0, prodeulerrat((p^k-k*p^(k-1))/(p-1)^k, 1, nextprime(k+1))) );
vMC=vector(#v+maxn,k, if(k<#v, 0, x=1.0;forprime(p=3,k,x/=p*(1-1.0/p)^k);forprime(p=k+1,v[#v]/2,x/=p-k);x) );
CC=vector(#v+maxn,k, 2^(k-1) * vMC[k] * BC[k]);
vC=extern(strexpand("hl1-vc.exe ",maxn," ",strjoin(v," "))); if(type(vC)!="t_VEC", print(vC); quit);\\Печать сообщения если ошибка
for(i=1,#vC, vC[i]*=CC[i+#v-1]);
print("vC=",vC);
Файл
hl1-vc.exe берём из облака
https://cloud.mail.ru/public/YDsR/3Lz7dmoT8 и кладём в текущую папку (или по path или в вызове явно указать путь к файлу).
Запускать можно и сам
hl1-vc.exe, первым параметром указывается максимальное загрязнение (maxn), потом список через пробел чисел паттерна (если он будет не с 0 - беда!). Сортировка паттерна не требуется (даже дубли чисел допустимы), надо только чтобы 0 был строго первым. Если паттерн не указать, то используется встроенный 19-252. Если не указать и максимальное загрязнение, используется 0 (считается только основная C=С0).
Если указать слишком большие параметры - выйдет по ошибке и PARI её должен показать (if после вызова). Если указать что-то некорректно (не числа), то должно так же выйти по какой-то произвольной ошибке.
При работе ничего не отображается, только результат по окончании. Это минус, да. Для себя сделал версию с показом прогресса, но смысла мало, только что не подвисла совсем уж - зависимость времени итераций квадратична начиная с максимальной, потому последние 2/3 прогресса просчитываются практически моментально.
Фактически
hl1-vc.exe считает для каждого загрязнения (включая и 0) сумму для всех возможных паттернов с таким загрязнением произведений количеств разрешённых остатков по простым до половины диаметра. Можно использовать и без PARI. Причём сделал ровно по своему PARI коду с битовыми масками и без оптимизации для симметричных паттернов, так что должно работать для любых (пока не проверил).
Пример вызова (для контроля):
Код:
C:\>hl1-vc.exe 99 0 18 24 48 60 78 84 90 108 120 144 150 168
[1743766987126899474e8, 2067197456861231798e9, 1154517952459778347e10, 4039425511898329840e10, 9223372036854775808e10, 1824534773030861902e11, 2599587815335058475e11, 2943175667936234025e11, 2691163466782095891e11, 2008928125102935912e11, 1232600332341856612e11, 6237667076157326906e10, 2604960512102486348e10, 8956581484542860411e9, 2521515108599682774e9, 5758838545480484912e8, 1051938614208073028e8, 1504546028164578485e7, 1631770029496499824e6, 1276139265473698171e5, 6609166036542326989e3, 1921130264456253527e2, 2036195042918400000e0]
Отрабатывает за 20с.
Yadryara, пользуйтесь, теперь статистикой завалитесь.
