Дискуссионный математический форумМатематический форум
Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 3 часа [ Летнее время ]
новый онлайн-сервис
число, сумма и дата прописью

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Программа на С++, обрезать и дописать
СообщениеДобавлено: 28 авг 2023, 04:44 
Не в сети
Свет и истина МРК
Аватара пользователя
Зарегистрирован:
06 янв 2015, 22:27
Сообщений: 6996
Откуда: Саратов
Cпасибо сказано: 782
Спасибо получено:
582 раз в 506 сообщениях
Очков репутации: -237

Добавить очки репутацииУменьшить очки репутации
Программа коллеги Алексея Белышева (whitefox)

▼ программа
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <vector>
#include <set>
#include <ctime>
#include <Windows.h>
#include "primesieve.h"

using namespace std;

typedef unsigned long long ull;
enum poziciya{chasy,minuty,sekundy,sdelano,vremya,interval,provereno,skorostq,vsego_16,konec};
enum shablony{s_16=15,s_17,s_18,s_19,s_20,s_21,s_22,s_23,s_24,s_25,s_26,s_27,s_28,s_29,s_30,s_31,s_32,s_33};

const int dlina_intervala = 2000000000;
const int chislo_shablonov = 18;
const int max_smew = ((s_33 + 1) >> 1);
const int centr = (s_33 >> 1) - 1;
const int ss = 100;
const int sss = 1000000;
const COORD koord[] = {{40,0},{51,0},{54,0},{13,2},{49,0},{0,1},{0,2},{0,3},{12,4},{0,22}};

class _kursor{
HANDLE ScrHandle;
public:
_kursor(){ScrHandle = GetStdHandle(STD_OUTPUT_HANDLE);}
void skrytq(){
CONSOLE_CURSOR_INFO kursinf;
GetConsoleCursorInfo(ScrHandle , &kursinf);
kursinf.bVisible = false;
SetConsoleCursorInfo(ScrHandle , &kursinf);
}
void pokazatq(){
CONSOLE_CURSOR_INFO kursinf;
GetConsoleCursorInfo(ScrHandle , &kursinf);
kursinf.bVisible = true;
SetConsoleCursorInfo(ScrHandle , &kursinf);
}
void pomestitq(COORD z){SetConsoleCursorPosition(ScrHandle, z);}
} kursor;

HANDLE hpotok;
DWORD idpotok;
UINT_PTR idTimer;
int speed, najdeno[chislo_shablonov];
ull start, endint, max_stop = primesieve::get_max_stop();
unsigned progress;
bool otobr, poisk, pros, provr;
vector<ull> primes;
clock_t nachtik;

void __stdcall TimerProc(HWND, UINT, UINT, DWORD);
DWORD __stdcall potok(void*);
bool vypolnitq();
bool init(int nabor[]);
void proverka(int nabor[]);
void vyvod(long long stprime, int nabor[], int st, int shablon);
void prov_ne_poln(int nabor[]);
void prov_nach_ne_poln(int nabor[]);
inline void vremya_vyvod(){
static int tik, minuta, chas;
if(tik > 57){
tik = 0;
if(minuta > 58){
minuta = 0;
chas++;
kursor.pomestitq(koord[chasy]);
cout << setw(10) << chas;
}
else minuta++;
kursor.pomestitq(koord[minuty]);
cout << setw(2) << setfill('0') << minuta;
kursor.pomestitq(koord[sekundy]);
cout << setw(2) << tik << setfill(' ');
}
else{
tik +=2;
kursor.pomestitq(koord[sekundy]);
cout << setw(2) << setfill('0') << tik << setfill(' ');
}
}
inline void inf_pros(){
kursor.pomestitq(koord[interval]);
cout << "Текущий интервал: [" << start << " ... " << endint << "]\nПросеяно : 0%";
kursor.pomestitq(koord[skorostq]);
cout << "Скорость : ";
if(speed) cout << setw(6) << speed;
else for(int i = s_16; i <= s_33; i++) cout << "\nНайдено " << (i + 1) << ':';
pros = false;
}
inline void inf_provr(){
kursor.pomestitq(koord[provereno]);
cout << "Проверено : 0%";
provr = false;
}
inline void inf_otobr(){
unsigned t;
kursor.pomestitq(koord[sdelano]);
if(poisk){
t = progress / ((primes.size() - 1) / ss);
cout << setw(5) << t;
COORD krd = koord[vsego_16];
for(int i = 0; i < chislo_shablonov; i++, krd.Y++){
kursor.pomestitq(krd);
cout << setw(6) << najdeno[i];
}
}
else{
t = primes.size() / sss;
cout << setw(5) << t;
}
}
inline void proverka_ch(int nabor[], int st, int i){
for(int j = 1, t = centr + st; j <= 7; j++){
if(nabor[(t - j) & s_32] != nabor[(t + j) & s_32]) return;
}
vyvod(primes[i - s_25], nabor, st + 8, s_16);
for(int j = 8, t = centr + st; j <= centr; j++){
if(nabor[(t - j) & s_32] != nabor[(t + j) & s_32]) return;
vyvod(primes[i - s_18 - j], nabor, st + s_16 - j, s_16 + ((j - 7) << 1));
}
}
inline void proverka_nch(int nabor[], int st, int i){
for(int j = 0, t = centr + st; j <= 7; j++){
if(nabor[(t - j) & s_32] != nabor[(t + j + 1) & s_32]) return;
}
vyvod(primes[i - s_25], nabor, st + 8, s_17);
for(int j = 8, t = centr + st; j <= centr; j++){
if(nabor[(t - j) & s_32] != nabor[(t + j + 1) & s_32]) return;
vyvod(primes[i - s_18 - j], nabor, st + s_16 - j, s_17 + ((j - 7) << 1));
}
}
inline void prov_nach(int nabor[], int i, int k){
for(int j = 0; j < (i >> 1); j++) if(nabor[k + j] != nabor[i - 1 + k - j]) return;
vyvod(primes[k], nabor, k, i);
}

int main(){
setlocale(LC_CTYPE, "rus");
system("cls");
kursor.skrytq();
cout << "Поиск ассоциативных наборов простых";
kursor.pomestitq(koord[vremya]);
cout << "0:00:00";
hpotok = CreateThread(NULL, 0, potok, NULL, 0, &idpotok);
idTimer = SetTimer(NULL, 1, 2000, TimerProc);
MSG msg;
while(true){
GetMessage(&msg, NULL, 0, 0);
DispatchMessage(&msg);
}
return 0;
}

DWORD __stdcall potok(void*){
ifstream fin("start.txt");
if(fin) fin >> start;
fin.close();
start &= 0xfffffffffffffffe;
while(vypolnitq());
KillTimer(NULL, idTimer);
Sleep(100);
cout << "\n\nДостигнут максимум " << max_stop << "\nДля выхода нажмите любую клавишу . . .\n";
system("pause > nul");
kursor.pokazatq();
exit(0);
return 0;
}

void __stdcall TimerProc(HWND, UINT, UINT, DWORD){
vremya_vyvod();
if(pros) inf_pros();
if(provr) inf_provr();
if(otobr) inf_otobr();
kursor.pomestitq(koord[konec]);
}

bool vypolnitq(){
if(start >= max_stop) return false;
endint = min(start + dlina_intervala, max_stop);
if(!otobr) otobr = true;
pros = true;
poisk = false;
primes.clear();
nachtik = clock();
primesieve::generate_primes(start, endint, &primes);
if(primes.size() <= s_16) return false;
int nabor[s_33];
if(!init(nabor)) return false;
proverka(nabor);
return true;
}

bool init(int nabor[]){
static bool inicial;
if(inicial){
if(primes.size() <= s_33){
if(primes.size() == s_33) prov_ne_poln(nabor);
return false;
}
for(int i = 0; i < s_33; i++) nabor[i] = int(primes[i + 1] - primes[i]);
}else{
if(primes.size() <= s_33){
prov_nach_ne_poln(nabor);
return false;
}
for(int i = 0; i < s_33; i++) nabor[i] = int(primes[i + 1] - primes[i]);
for(int i = s_16; i <= s_30; i++)
for(int k = 0; k < max_smew - ((i + 1) >> 1); k++) prov_nach(nabor, i, k);
inicial = true;
}
return true;
}

void proverka(int nabor[]){
poisk = provr = true;
int st = 0;
for(size_t i = s_33;; i++){
proverka_ch(nabor, st, i);
proverka_nch(nabor, st, i);
if(i >= primes.size() - 1) break;
nabor[st] = int(primes[i + 1] - primes[i]);
st = (st + 1) & s_32;
progress = i;
}
speed = int(7200000.0 / (clock() - nachtik) + 0.5);
start = primes[primes.size() - s_33] - 1;
ofstream fout("start.txt");
fout << start;
fout.close();
}

//s_17 - ((shablon + 1) >> 1)

void vyvod(long long stprime, int nabor[], int st, int shablon){
ostringstream imya;
imya << "kpppch_" << (shablon + 1) << ".txt";
ofstream fout(imya.str(), ios::out | ios::app);
fout << stprime << ": 0";
for(int i = 0, sum = 0; i < shablon; i++) fout << ' ' << (sum += nabor[(st + i) & s_32]);
fout << endl;
najdeno[shablon - s_16]++;
}

void prov_ne_poln(int nabor[]){
for(int i = 0; i < s_32; i++) nabor[i] = int(primes[i + 1] - primes[i]);
for(int i = s_16; i <= s_31; i++){
for(int j = s_16 - ((i + 1) >> 1); j <= s_20 - ((i + 2) >> 1); j++){
for(int k = 0; k < (i >> 1); k++){if(nabor[k + j] != nabor[i - 1 - k + j]) goto next;}
vyvod(primes[j], nabor, j, i);
next: ;
}
}
}

void prov_nach_ne_poln(int nabor[]){
int raz = primes.size() - 1;
for(int i = 0; i < raz; i++) nabor[i] = int(primes[i + 1] - primes[i]);
for(int i = s_16; i <= raz; i++){
for(int j = 0; j <= raz - i; j++){
for(int k = 0; k < (i >> 1); k++){if(nabor[k + j] != nabor[i - 1 - k + j]) goto next;}
vyvod(primes[j], nabor, j, i);
next: ;
}
}
}

Рассказываю, что делает эта программа.
В программу водится из входного файла start.txt начало диапазона, например: [math]7900284711475208887[/math].

Начиная с этой точки, фиксируется интервал длиной 2000000000 (2 миллиарада).
В этом интервале с помощью генератора primesieve генерируются все простые числа.
Массив э сгенерированных простых чисел хранится в программе.

Далее в этом массиве ищутся симметричные кортежи из последовательных простых чисел.
Этот поиск нам не нужен!
Мы будем искать в массиве простых чисел совсем другие последовательности простых чисел.
Об этих специальных последовательностях напишу позже.

Как вы поняли, в программе whitefox нужно оставить только генерацию простых чисел генератором primesieve.
Дальше надо дописать программу.

Если вам удастся сделать это (обрезать и дописать программу), пожалуйста, сделайте.
Если готовы сделать, дайте знать; я напишу, какие специальные последовательности простых чисел нам надо искать в сгенерированном массиве простых чисел.

PS. Поиск в программе whitefox ведётся порциями; дальше простые числа генерируются в следующем интервале длиной 2 миллиарда и всё повторяется.
Мы будем так же искать последовательности.
Только надо будет сделать конец проверяемого интервала.
Программа whitefox будет работать бесконечно, пока не дойдёт до разрешённой границы диапазона (2^64), если её не прервать.

Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему      Страница 1 из 1 [ 1 сообщение ]

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Дописать часть схемы взаимодействия

в форуме Химия и Биология

Veinar

4

665

28 ноя 2013, 11:48

Программа

в форуме Ряды Фурье и Интегральные преобразования

Lfed

8

739

08 окт 2021, 20:33

Программа на ассемблере

в форуме Информатика и Компьютерные науки

PINGuinich

0

277

29 июн 2019, 15:06

Многопоточная программа

в форуме Информатика и Компьютерные науки

Nataly-Mak

0

279

27 июн 2019, 09:12

Программа с метками

в форуме Информатика и Компьютерные науки

johnybsraynilol

1

352

02 ноя 2017, 18:23

Программа сортировки

в форуме Информатика и Компьютерные науки

Nataly-Mak

5

547

28 авг 2020, 13:22

Программа Gephi

в форуме Информатика и Компьютерные науки

Nataly-Mak

18

632

31 авг 2020, 20:48

Программа SageMath

в форуме Информатика и Компьютерные науки

Nataly-Mak

1

354

10 янв 2021, 21:10

Программа для рыбалки

в форуме Размышления по поводу и без

Hoper

3

388

23 сен 2019, 11:44

Программа для простенькой процедуры

в форуме Информатика и Компьютерные науки

Nataly-Mak

23

94209

03 май 2019, 18:38


Часовой пояс: UTC + 3 часа [ Летнее время ]



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  

Яндекс.Метрика

Copyright © 2010-2022 MathHelpPlanet.com. All rights reserved