C++

Быстрый поиск совершенных чисел

Чтобы легко можно было отсылать вопрошающих по этому вопросу, создаю новую тему.
Напомню, что
Совершенное число — натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа).

#include <iostream>
#include<cstdlib>
const unsigned long long N = 5000000000000000000llu;
 
// решето Эратосфена
void Eratosfen(char *a, unsigned long n)
{
    unsigned long i, j;
    a[0] = a[1] = 0; a[2] = 1;
    for(i = 4; i < n; i += 2)
        a[i] = 0;
    for(i = 3; i < n; i += 2)
        a[i] = 1;
    i = 3;
    while (i*i <= n)
    {
        for(j = i << 1; j < n; j += i)
            a[j] = 0;
        i += 2;
        while (i < n && a[i] == 0)
            i += 2;
    }
}
 
// количество значащих бит числа
unsigned long Count(unsigned long long a)
{
   unsigned long long count;
   for(count = 0; a; a >>= 1)
      ++count;
   return count;        
}
 
// проверка на простоту
int Prime(unsigned long long a)
{
   unsigned long long i;
   if (a == 2)
      return 1;
   if (a == 0 || a == 1 || a % 2 == 0)
      return 0;
   for(i = 3; i*i <= a && a % i; i += 2)
      ;
   return i*i > a;
}
 
int main()
{
   char *eratosfen;
   unsigned long long sov, i, n = (Count(N) >> 1) + 1; 
   eratosfen = (char *)calloc(n, sizeof(*eratosfen));
   Eratosfen(eratosfen, n);
   // вывод совешенных чисел
   for(i = 2; i < n; ++i)
      if (eratosfen[i] && Prime((1 << i) - 1))
      {
         sov = ((1llu << i) - 1llu) << (i - 1llu);
         std::cout << (unsigned long long)sov << std::endl;
      }
   
   free(eratosfen);
   return 0;    
}
Теги:
Быстрый поиск, совершенные чисела
Добавлено: 16 Сентября 2013 02:39:28 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...