Не показано что именно считает count_clean_tuples.
Вот код
(Оффтоп)
Код:
count_clean_tuples_v2(pattern, num_probes, start_order, end_order) = {
my(k = #pattern, d);
my(million = 10^6);
my(diffs, L, lo, hi, total_found, start, end_n, P, is_match, result,vec_result);
\\ 1. Подготовка: сортировка и создание вектора шагов (разностей) и вектора результатов
pattern = vecsort(pattern);
d = vecmax(pattern);
vec_result=vector(end_order-start_order+1,i,vector(2));
\\ Если паттерн состоит из одного числа, разностей нет
if(k > 1,
diffs = vector(k - 1, i, pattern[i+1] - pattern[i]);
L = #diffs;
,
L = 0;
);
for(N = start_order, end_order,
lo = 10^(N-1);
hi = 10^N - million;
total_found = 0;
for(probe = 1, num_probes,
start = lo + random(hi - lo + 1);
end_n = start + million - 1;
\\ 2. Векторизация: получаем все простые числа на отрезке сразу.
\\ Добавляем 'd' к верхней границе, чтобы паттерн, начинающийся
\\ в самом конце отрезка, поместился целиком.
P = primes([start, end_n + d]);
\\ Защита от пустых массивов (если на отрезке почти нет простых чисел)
if(#P < k, next);
\\ 3. Скользящее окно: проходим по сгенерированному массиву
for(i = 1, #P - L,
\\ Мы считаем кортеж, только если его начало лежит внутри миллионного отрезка
if(P[i] > end_n, break);
is_match = 1;
\\ Сравниваем расстояния между соседними простыми числами с вектором diffs
for(j = 1, L,
if(P[i+j] - P[i+j-1] != diffs[j],
is_match = 0;
break;
);
);
if(is_match, total_found++);
);
);
result = round(total_found / num_probes);
vec_result[N-start_order+1]=[N,result];
print("От 1e", N-1, " до 1e", N, " : ~ ", result, " кортежей ",pattern," на миллион");
);
print("v=",vec_result);
}
Он считает сколько попалось чистых кортежей в случайно выбранных миллионных отрезках внутри порядков.
Я немного доработал печать результата для ясности.
count_clean_tuples_v2(pattern, num_probes, start_order, end_order)pattern - вектор смещений простых чисел в паттерне, например [0,60] предполагается что первое смещение ноль
num_probes количество отрезков длиной 10^6 для подсчёта (т.е. сколько случайных отрезков длиной миллион проверить)
start_order начальный порядок, показатель степени десятки. "Внутри порядка" имеется в виду числа меньшие 10 в степени start_order
end_order конечный порядок
Запуск:
Код:
? count_clean_tuples_v2([0,60], 5 , 10, 30)
От 1e9 до 1e10 : ~ 435 кортежей [0, 60] на миллион
От 1e10 до 1e11 : ~ 478 кортежей [0, 60] на миллион
От 1e11 до 1e12 : ~ 539 кортежей [0, 60] на миллион
От 1e12 до 1e13 : ~ 542 кортежей [0, 60] на миллион
От 1e13 до 1e14 : ~ 552 кортежей [0, 60] на миллион
От 1e14 до 1e15 : ~ 542 кортежей [0, 60] на миллион
От 1e15 до 1e16 : ~ 535 кортежей [0, 60] на миллион
От 1e16 до 1e17 : ~ 553 кортежей [0, 60] на миллион
От 1e17 до 1e18 : ~ 529 кортежей [0, 60] на миллион
От 1e18 до 1e19 : ~ 501 кортежей [0, 60] на миллион
От 1e19 до 1e20 : ~ 489 кортежей [0, 60] на миллион
От 1e20 до 1e21 : ~ 459 кортежей [0, 60] на миллион
От 1e21 до 1e22 : ~ 425 кортежей [0, 60] на миллион
От 1e22 до 1e23 : ~ 445 кортежей [0, 60] на миллион
От 1e23 до 1e24 : ~ 433 кортежей [0, 60] на миллион
От 1e24 до 1e25 : ~ 408 кортежей [0, 60] на миллион
От 1e25 до 1e26 : ~ 383 кортежей [0, 60] на миллион
От 1e26 до 1e27 : ~ 369 кортежей [0, 60] на миллион
От 1e27 до 1e28 : ~ 370 кортежей [0, 60] на миллион
От 1e28 до 1e29 : ~ 347 кортежей [0, 60] на миллион
От 1e29 до 1e30 : ~ 338 кортежей [0, 60] на миллион
v=[[10, 435], [11, 478], [12, 539], [13, 542], [14, 552], [15, 542], [16, 535], [17, 553], [18, 529], [19, 501], [20, 489], [21, 459], [22, 425], [23, 445], [24, 433], [25, 408], [26, 383], [27, 369], [28, 370], [29, 347], [30, 338]]
time = 1min, 2,976 ms.
?
В конце печатается вектор результатов, его можно скопипастить в какую-то следующую функцию, которая сделает сглаживание, найдёт максимум, а то и, чем чёрт не шутит, методом наименьших квадратов посчитает поправленную безымянную константу или ещё что-нибудь.