2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1 ... 29, 30, 31, 32, 33, 34, 35 ... 73  След.
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение05.05.2024, 19:43 
Аватара пользователя


29/04/13
9116
Богородский
Может формула сложнее для сложных паттернов...

Dmitriy40 в сообщении #1638057 писал(а):
Очень интересно как это у Вас та же программа досчитала до 71# всего за час.

Она не совсем та же. Сейчас я приведу её в божеский вид и опубликую. Запустите у себя и сверите.

Код:
allocatemem(2^30);

{print();

pfin=67; pn=nextprime(pfin+1);

v=[0, 12, 30, 42, 54, 72, 90, 102, 114, 132, 2*pn, 144];

a=setminus(vector(v[#v]/2,i,i*2),v);
ww=vector(v[#v]/2+3-#v,i,Map()); mapput(ww[#ww],2^#a-1,1);

print(#a," a = ",a);
print();

forprime(p=2, pfin, \\nextprime(v[#v]/2),

tz0=getwalltime();

print();

m=setminus(vector(p,i,i-1),Set(-v%p));
am=vecextract(vector(p-1,i,fromdigits(Vecrev(apply(t->(t+i)%p>0,a)),2)),m);
   for(k=1,#ww,
      rr=Map(); kvar=0;
      foreach(ww[k],m,
         b=m[1][1]; qq=m[1][2]; qn=0; kvar++;
         foreach(am,x,
            y=bitand(x,b);
            if(y==b, qn+=qq; next);
            hy=hammingweight(y)+2; nn=0;
            if(mapisdefined(ww[hy],y,&nn), nn+=qq , nn=qq);
            mapput(ww[hy],y,nn);
         );
         if(qn>0, mapput(rr,b,qn); );
      );
      ww[k]=rr;
if(ww[k] <> Map([;]),
);
   );
   vc=vector(#ww); for(k=1,#ww, foreach(ww[k],x, vc[k]+=x[1][2]; ); );
   vcmax=#vc; while(vcmax>1&&vc[vcmax]==0, vcmax--);
   print("--> ",nextprime(p+1),"# : ",strjoin(2*vc[1..vcmax],", "),", sum = ",2*vecsum(vc),", time: ",strtime(getwalltime()-tz0));
print();
);
print();
}quit;


-- 05.05.2024, 20:15 --

Yadryara в сообщении #1638062 писал(а):
Пару ошибок у себя нашёл, одну исправил, со 2-й разбираюсь...

Понял, где ошибка. cg для маленьких $p$ считаются сложнее даже если $p$ больше четверти диаметра.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение05.05.2024, 20:52 
Заслуженный участник


20/08/14
12194
Россия, Москва
Yadryara в сообщении #1638079 писал(а):
Код:
pfin=67; pn=nextprime(pfin+1);
v=[0, 12, 30, 42, 54, 72, 90, 102, 114, 132, 2*pn, 144];
И что это должно значить? С чего вдруг v[] стал длиной 12?! И не симметричным?

А в коде дальше не вижу никаких изменений кроме косметических.

И да, с таким паттерном программа работает примерно вчетверо быстрее, наверняка за час справится. Ну так это другой паттерн!

-- 05.05.2024, 20:56 --

ww[k] <> Map([;]) упрощается до #ww[k]>0.

-- 05.05.2024, 21:16 --

kvar в итоге тоже равна просто #ww[k] до цикла обработки ww[k], её не обязательно обнулять и потом увеличивать.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение05.05.2024, 21:52 
Аватара пользователя


29/04/13
9116
Богородский
Dmitriy40 в сообщении #1638089 писал(а):
И что это должно значить?

Это означает, что найден способ правильно и быстро вычислять cg[] для $p$ близких к половине диаметра.

Dmitriy40 в сообщении #1638089 писал(а):
С чего вдруг v[] стал длиной 12?!

Я далеко не сразу к этому пришёл. Соответственно и рассказать в двух словах не получится.

Dmitriy40 в сообщении #1638089 писал(а):
И не симметричным?

Симметрия учитывается, умножаю на 2:

print("--> ",nextprime(p+1),"# : ",strjoin(2*vc[1..vcmax],", "),", sum = ",2*vecsum(vc),", time: ",strtime(getwalltime()-tz0));

Но можно не умножать, а ещё час считать симметричный паттерн

v=[0, 144-2*pn, 12, 30, 42, 54, 72, 90, 102, 114, 132, 144]; с ровно таким же результатом.

Dmitriy40 в сообщении #1638089 писал(а):
И да, с таким паттерном программа работает примерно вчетверо быстрее, наверняка за час справится. Ну так это другой паттерн!

Ну так в этом и красота идеи — быстрее считать нужный массив для того самого паттерна через другой паттерн.

Проверить, кстати можете и сами, ибо я пока не умею так высоко вычислять g2. Формулы, надеюсь, по-прежнему работают:

Код:
vc[l]=

(p-l)*vc[l] + (l-lmin+1)*vc[l+1]
+     cg[l] -            cg[l+1]
+     g2[l] -          2*g2[l+1] + g2[l+2]

$p=71, lmin=11, lmax=31$

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение05.05.2024, 22:29 
Заслуженный участник


20/08/14
12194
Россия, Москва
Yadryara в сообщении #1638099 писал(а):
Ну так в этом и красота идеи — быстрее считать нужный массив для того самого паттерна через другой паттерн.
Могли прямо об этом сказать, я бы не ломал голову чего у меня PARI такой тормозной.
Красиво, согласен.

-- 05.05.2024, 22:38 --

А с 19-252 фокус не проходит ... Или я его не понимаю.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение05.05.2024, 22:42 
Аватара пользователя


29/04/13
9116
Богородский
Сразу сказал:

Yadryara в сообщении #1638026 писал(а):
То есть до 71# я добрался примерно за 2 с половиной часа, перезапуская прогу каждый раз для всех финальных значений 37#, 41#, ... , 71# , с различными включениями в паттерн.

Для 37#, например, нужно 5 включений:

Код:
pfin=31; pn=nextprime(pfin+1);
cg=vector(31);
for (o=1,5,
v=[0, 12, 30, 42, 54, 72, 2*pn, 90, 102, 114, 132, 144];
v[7]=v[o]+2*pn;

И тогда должно сойтись то, что не сходилось в примере. Но пока не доделал.

-- 05.05.2024, 22:54 --

Dmitriy40 в сообщении #1638102 писал(а):
А с 19-252 фокус не проходит ... Или я его не понимаю (добавление 226 в паттерн).

Потому что нужно добавить ещё и $232 (6+226)$ и $238 (12+226)$. И все 3 включения отдельно обсчитать.

Вы ещё 40 способов придумаете как ускорить :-)

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 08:22 
Аватара пользователя


29/04/13
9116
Богородский
Yadryara в сообщении #1638074 писал(а):
Ну вот в этом месте уже можно сверить. Пока не устранённое расхождение:
Yadryara в сообщении #1638104 писал(а):
И тогда должно сойтись то, что не сходилось в примере. Но пока не доделал.

Доделал. Вроде сошлось. Теперь так:

Код:
v=[0, 12, 30, 42, 54, 72, 90, 102, 114, 132, 144];

lmax = 31

31# --> 37#                                                           Sum

vc = [   5617466,  3288286,  1227208,  252110,  24342,   980 ]   27648000
                                                           *
                                                           6
                                                           +
cg = [  10460054,  6497630,  2608364,  574980,  59710,  2660 ]   49631616
                                                           +
g2 = [   4423660,  2784734,  1138406,  263552,  30854,  1540 ]   19258752
                                                           =
vc = [ 118359724, 58406136, 18258392, 3198032, 274818, 10080 ]  718848000

Dmitriy40 в сообщении #1638089 писал(а):
ww[k] <> Map([;]) упрощается до #ww[k]>0.

-- 05.05.2024, 21:16 --

kvar в итоге тоже равна просто #ww[k] до цикла обработки ww[k], её не обязательно обнулять и потом увеличивать.

Прошу прощения, это я ещё не все отладочные вещи удалил. Я даже не поменял обозначения в той проге: просто помнил, что считается не vc[], a cg[].

Yadryara в сообщении #1638099 писал(а):
Проверить, кстати можете и сами, ибо я пока не умею так высоко вычислять g2.

А ведь именно для 71# g2[] уже нулевой, так что формула проще:

Код:
vc[l]=

(p-l)*vc[l] + (l-lmin+1)*vc[l+1]
+     cg[l] -            cg[l+1]

$p=71, lmin=11, lmax=31$

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 09:27 
Аватара пользователя


29/04/13
9116
Богородский
Yadryara в сообщении #1638124 писал(а):
Вроде сошлось.

То, что правый край сходится, это видно, а ещё два правых значения нового vc[] проверил по формуле:

Код:
vc[l]=

(p-l)*vc[l] + (l-lmin+1)*vc[l+1]
+     cg[l] -            cg[l+1]
+     g2[l] -          2*g2[l+1] + g2[l+2]


(37-30)*vc[30] + (30-11+1)*vc[30+1]
+       cg[30] -           cg[30+1]
+       g2[30] -         2*g2[30+1] + g2[30+2]

(37-30)*24342 + (30-11+1)*980
+       59710 -           2660
+       30854 -         2*1540      + 0           =   274818


(37-29)*vc[29] + (29-11+1)*vc[29+1]
+       cg[29] -           cg[29+1]
+       g2[29] -         2*g2[29+1] + g2[29+2]

(37-29)*252110 + (29-11+1)*24342
+       574980 -           59710
+       263552 -         2*30854    + 1540        =  3198032

Дальше не проверял.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 10:28 
Аватара пользователя


29/04/13
9116
Богородский
Ну а вот прога, которая это посчитала, то есть из vc[] для 5 разных паттернов длиной $l+1$ простым сложением получила cg[] для паттерна длиной $l$.

Вроде почистил получше:

Код:
allocatemem(2^30);
{print();
pfin=31; pn=nextprime(pfin+1);cg=vector(21);
for (o=1,5,
v=[0, 12, 30, 42, 54, 72, 2*pn, 90, 102, 114, 132, 144];
v[7]=v[o]+2*pn;

a=setminus(vector(v[#v]/2,i,i*2),v);
ww=vector(v[#v]/2+3-#v,i,Map()); mapput(ww[#ww],2^#a-1,1);

forprime(p=2, pfin,

tz0=getwalltime();
m=setminus(vector(p,i,i-1),Set(-v%p));
am=vecextract(vector(p-1,i,fromdigits(Vecrev(apply(t->(t+i)%p>0,a)),2)),m);
   for(k=1,#ww,
      rr=Map();
      foreach(ww[k],m,
         b=m[1][1]; qq=m[1][2]; qn=0;
         foreach(am,x,
            y=bitand(x,b);
            if(y==b, qn+=qq; next);
            hy=hammingweight(y)+2; nn=0;
            if(mapisdefined(ww[hy],y,&nn), nn+=qq , nn=qq);
            mapput(ww[hy],y,nn);
         );
         if(qn>0, mapput(rr,b,qn); );
      );
      ww[k]=rr;
   );
   vc=vector(#ww); for(k=1,#ww, foreach(ww[k],x, vc[k]+=x[1][2]; ); );
   vcmax=#vc; while(vcmax>1&&vc[vcmax]==0, vcmax--);
if(p==31,   print("o = ",o,"  --> ",nextprime(p+1),"# : ",strjoin(2*vc[1..vcmax],", "),", sum = ",2*vecsum(vc),", time: ",strtime(getwalltime()-tz0));
);
);

for(ll=1,#cg,cg[ll]+=2*vc[vcmax-#cg+ll]);
print();print();
);
print();print(#cg,"  cg = ",cg, "    ",vecsum(cg));
print();print();
}quit;

Пока самым примитивным способом: все 5 паттернов обсчитаны с нуля.

Можно ведь и g2[] и g0[] тоже считать через vc[] для более длинных паттернов. И, в каких-то случаях, это тоже может быть быстрее.

Dmitriy40 в сообщении #1638089 писал(а):
И да, с таким паттерном программа работает примерно вчетверо быстрее, наверняка за час справится.

Небось за 40-45 минут справилась. Но ещё её результат проверить надо. У Вас все цифры есть.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 13:43 
Заслуженный участник


20/08/14
12194
Россия, Москва
Yadryara в сообщении #1638141 писал(а):
Код:
]for (o=1,5,
v=[0, 12, 30, 42, 54, 72, 2*pn, 90, 102, 114, 132, 144];
v[7]=v[o]+2*pn;

a=setminus(vector(v[#v]/2,i,i*2),v);
Так делать нельзя: setminus требует чтобы оба аргумента были типа Set (сортированы по возрастанию и без дублей). Потому после установки значения v[7] надо натравить на него v=Set(v). Сравните для o=5 с и без этого (print(setminus(setminus(vector(v[#v]/2,i,i*2),v),setminus(vector(v[#v]/2,i,i*2),Set(v))));), увидите что без в a[] остаются элементы 90, 102, 114, которых в a[] быть никак не должно!
Соответственно что там дальше в программе считается - бог весть. Даже если вдруг что-то и совпало - это тоже ошибка.

Yadryara в сообщении #1638141 писал(а):
Код:
hy=hammingweight(y)+2;
Скажите, а почему +2? У меня было +1. Это осталось от каких-то экспериментов или имеет глубокий смысл? Или это только для удобства непоказанных расчётов?
Насколько я вижу это ни на что не влияет, только смещает vc[] вправо на 1 элемент. При этом vc[1] становится чище абсолютно чистого (количество грязи меньше нуля) и этого мне уже не понять как такое возможно и зачем это учитывать.
Я +1 делаю потому что для чистого варианта количество грязи 0 (длина оставшегося a[] или количество единиц в маске), но массивы/векторы в PARI начинаются с 1, вот и смещаю чистые в 1-ю позицию. Зачем чистые смещать ещё правее, ведь чище чистого быть не может и потому vc[1]=0 тождественно.

Yadryara в сообщении #1638141 писал(а):
У Вас все цифры есть.
Запустите (например отдельным потоком) с исходным вектором v[] и часов через 5 и у Вас будут все цифры. А первые для сравнения (41# и 43#) и уже через полчаса.

-- 06.05.2024, 14:11 --

Dmitriy40 в сообщении #1638169 писал(а):
сортированы по возрастанию и без дублей
Дубли оказывается не мешают, а вот сортированность строго необходима.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 16:28 
Аватара пользователя


29/04/13
9116
Богородский
Dmitriy40 в сообщении #1638169 писал(а):
что без в a[] остаются элементы 90, 102, 114, которых в a[] быть никак не должно!

Посмотрю.

Dmitriy40 в сообщении #1638169 писал(а):
Даже если вдруг что-то и совпало - это тоже ошибка.

Так вроде всё совпало.

Dmitriy40 в сообщении #1638169 писал(а):
Скажите, а почему +2? У меня было +1. Это осталось от каких-то экспериментов или имеет глубокий смысл? Или это только для удобства непоказанных расчётов?

То-то и оно, что я не помню уже точно. Что-то у меня не сходилось и я
добавил ещё единичку. А! Ну так это вроде связано с тем что v[] удлинился ведь на единичку и a[] из-за этого укоротился тоже на на единичку.

Dmitriy40 в сообщении #1638169 писал(а):
А первые для сравнения (41# и 43#) и уже через полчаса.

Я уже пробовал считать g2 для 11-144 и дальше 37# не хватает памяти.

Yadryara в сообщении #1638141 писал(а):
Можно ведь и g2[] и g0[] тоже считать через vc[] для более длинных паттернов.

А вот уже не помню как именно хотел сделать.

-- 06.05.2024, 16:44 --

Dmitriy40 в сообщении #1638169 писал(а):
Соответственно что там дальше в программе считается - бог весть. Даже если вдруг что-то и совпало - это тоже ошибка.

Поправил. Обе строки cg всё равно абсолютно идентичны.

Это хороший знак. Значит что-то лишнее считается и это можно сократить...

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 16:54 
Заслуженный участник


20/08/14
12194
Россия, Москва
Yadryara в сообщении #1638217 писал(а):
А! Ну так это вроде связано с тем что v[] удлинился ведь на единичку и a[] из-за этого укоротился тоже на на единичку.
Максимум hy тогда стал на 1 меньше вот и всё, минимум, который всегда строго нулевой (ноль грязи, чистый вариант), не изменился. А +1 в hy связано именно и только с минимумом, нет в PARI элемента vc[0] (и ww[0] тоже).
На работу это не влияет, просто странно. И чуть сбивает нумерацию (vcmax становится на 1 больше).

Yadryara в сообщении #1638217 писал(а):
Я уже пробовал считать g2 для 11-144 и дальше 37# не хватает памяти.
Можно после строки
hy=hammingweight(y)+1;
добавить команду
if(hy<13, next);
которая не будет накапливать варианты с малым количеством грязи (и соответственно sum будет неверной), но сколько-то (в данном случае 9) правых элементов vc[] будут правильными до конца. Надо будет только подобрать число в условии чтобы хватало памяти на все ww[]. По идее можно получить 9 правых элементов как и указал, это около 6млн элементов в ww[], учитывая что для 37# их 5.8млн и оно в память влезает, а для 41# их 12млн и не влезает.
Правые элементы для 19-252 я посчитал по 127# именно так.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение06.05.2024, 17:29 
Аватара пользователя


29/04/13
9116
Богородский
Dmitriy40 в сообщении #1638223 писал(а):
Максимум hy тогда стал на 1 меньше вот и всё, минимум, который всегда строго нулевой (ноль грязи, чистый вариант), не изменился. А +1 в hy связано именно и только с минимумом, нет в PARI элемента vc[0] (и ww[0] тоже).

Да я тогда ещё понял зачем Вы единичку добавили. И, когда добавлял ещё одну, понимал для чего я это делаю.

Dmitriy40 в сообщении #1638223 писал(а):
По идее можно получить 9 правых элементов как и указал,

Попробую.

Yadryara в сообщении #1638217 писал(а):
Поправил. Обе строки cg всё равно абсолютно идентичны.

Это хороший знак. Значит что-то лишнее считается и это можно сократить...

Если из правильного a[] выбросить один элемент, причём именно правый a=a[1..60];, то всё равно считает правильно.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение07.05.2024, 11:11 
Аватара пользователя


29/04/13
9116
Богородский
Dmitriy40 в сообщении #1638223 писал(а):
добавить команду
if(hy<13, next);
которая не будет накапливать варианты с малым количеством грязи (и соответственно sum будет неверной), но сколько-то (в данном случае 9) правых элементов vc[] будут правильными до конца. Надо будет только подобрать число в условии чтобы хватало памяти на все ww[].

9 правых посчитались только раз, для 41#. Затем исправил 13 на 14 и посчитались 8 правых уже вплоть до окейной 73#.

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

Что-то у нас gris замолчал. Опять небось матрёшничает втихаря :-) Да ещё и с перебором: 30300 раз вместо 30030 :roll:

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение07.05.2024, 14:45 
Аватара пользователя


29/04/13
9116
Богородский
Yadryara в сообщении #1638323 писал(а):
Перепроверяю, пока всё сходится.

Перестало сходиться. Ищу ошибку. Это может затянуться.

Я конечно могу выложить ту часть таблицы, где сошлось всё, что проверял. Если кому-нибудь интересно.

 Профиль  
                  
 
 Re: кортежи последовательных простых. ключ к 19-252
Сообщение07.05.2024, 15:13 
Заслуженный участник


20/08/14
12194
Россия, Москва
Я предпочту доверить сравнение Вам. ;-)
И подождать пока оформится следующая гениальная идея (я и эту то не понимаю) - как считать более чем на один шаг вперёд. Всё же пока выигрыш слишком мал, даже с удлинением паттернов.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 1087 ]  На страницу Пред.  1 ... 29, 30, 31, 32, 33, 34, 35 ... 73  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: ihq.pl


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group