Форум программистов, компьютерный форум CyberForum.ru

Нахождения больших простых чисел - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как батником задать значение переменной программе Visual C++ http://www.cyberforum.ru/cpp-beginners/thread1140920.html
пишу в Bat код consol.exe -peremenna 55 -pluss 100 Pause Екзешник consol.exe принемает код Батника запускаеться и выполняет подсчет и выводит на екран 55+100=155
C++ Запись и чтение в тестовый файл Создаете текстовый файл example.txt, содержащий текст "C++ is able to input and output the built - in data types using the stream extraction operator>>and the stream insertiomn operator<<.The stream insertion and stream extraction operators also can be overloaded to perform input and output for user-defined types like an object.". Необходимо заменить в тексте все слова длиной 5 символов на... http://www.cyberforum.ru/cpp-beginners/thread1140911.html
В C заносятся из A все отрицательные числа. Потом A дополняется из B числами, перед которыми встречаются отр числа C++
В C заносятся из A все отрицательные числа. Потом A дополняется из B числами, перед которыми встречаются отрицательные числа.
Работа со строками текстового файла C++ Builder
Добрый вечер уважаемые участники. Хотел попросить у Вас помощи, часть программы сделал, а часть никак, может время позднее влияет...Буду краток, у меня есть зашифрованный текстовый файл, который включает в себя тестовое количеств баллом на необходимую оценку и задание с правильными вариантами ответа. Всё рсположено построчно т.е.: отлично 50 хорошо 40 удовлетворительно 30 . //обозначение...
C++ Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки http://www.cyberforum.ru/cpp-beginners/thread1140886.html
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки. 1. Я дуб дубом,даже не понимаю что надо сделать( 2. Надеюсь на помощь 3. Win32
C++ В одномерном массиве состоящим из n элементов вычислить номер минимального элемента в одномерном массиве состоящим из n элементов вычислить 1)номер минимального элемента 2)сумма элементов расположенных между первым и вторым отрицательными элементами преобразовать массив так, чтобы сначала располагались все элементы модуль которых меньше 1 ,а потом все- остальные. подробнее

Показать сообщение отдельно
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.04.2014, 05:41     Нахождения больших простых чисел
Student_161, а насколько больших? Если просто простых, то Вам думаю подойдет и решето Эратосфена:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <memory.h>
 
void resheto(bool prime[])
{
    for(i=3;(temp=i*i) <=n;i+=2)
        if(prime[i])
            for(j=temp;j<=n;j+=i)
                prime[j]=false;
}
 
int main()
{
    bool *prime=new bool[n+1];
    memset(prime,1,n+1);
    prime[0]=prime[1]=false;
    resheto(prime);
}
Также есть и линейное решето Эратосфена:http://e-maxx.ru/algo/prime_sieve_linear
Можете погуглить в сторону решета Аткина, но оно особо сильного выигрыша не даст, хотя он и будет.

Можно пойти другим путём, проверять числа на простоту. Тут уже подойдет разнообразные тесты. Простой факторизацией - это слишком долго, поэтому тесты обычно вероятностные. Лично я в олимпиадах использую всегда тест Миллера-Рабина, улучшенный со слов Гены Короткевича, который нам лекции читал.Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
 
using namespace std;
typedef long long ll;
 
ll n,s,t,k;
ll p[3]={2,7,61};
 
ll mulmod(ll x,ll y,ll n)
{
    ll res=0;
    while(y)
    {
        if(y&1) res=(res+x)%n;
        x=(x+x)%n;
        y>>=1;
    }
    return res;
}
 
ll powmod(ll x,ll y,ll n)
{
    ll res=1;
    while(y)
    {
        if(y&1) res=mulmod(res,x,n);
        x=mulmod(x,x,n);
        y>>=1;
    }
    return res;
}
 
 
bool miller(ll s,ll t,ll a)
{
    ll x=powmod(a,t,n);
    if(x==1 || x==n-1)  return true;
    for(ll j=1;j<s;++j)
    {
        x=mulmod(x,x,n);
        if(x==1)    return false;
        if(x==n-1)  return true;
    }
    return false;
}
 
bool del()
{
    ll temp=sqrt(n);
    for(ll i=2;i<=temp;++i)
        if(n%i==0)
            return false;
    return true;
}
 
bool check()
{
    if(n<=1)    return false;
    if(n==2)    return true;
    if(n<=100)  return del();
    t=n-1;
    while(!(t&1))
    {
        ++s;
        t>>=1;
    }
    bool ok=true;
    for(ll j=0;j<3 && ok;++j)
        ok=miller(s,t,p[j]);
    return ok;
}
 
 
int main()
{
    cin>>n;
    cout<<check()<<endl;
    system("pause");
    return 0;
}
Тест работает правильно до 10 в 18 степени(дальше не проверял просто).
Также можете смотреть в сторону теста BPSW : http://e-maxx.ru/algo/bpsw
 
Текущее время: 12:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru