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 | #include <QtMath>
#include "GoldbachWorker.h"
GoldbachWorker::GoldbachWorker(long long number)
: number{number}
{
}
void GoldbachWorker::run()
{
long long sumCount = this->calculate(this->number);
emit calculationDone(sumCount);
}
long long GoldbachWorker::calculate(long long number)
{
if ( number < 4 || number == 5 ) return 0;
return number % 2 == 0 ? calculateEvenGoldbach(number) : calculateOddGoldbach(number);
}
long long GoldbachWorker::calculateEvenGoldbach(long long number)
{
long long results = 0;
for ( long long a = 2; a < number && this->isInterruptionRequested() == false; ++a )
{
emit this->progressUpdated( static_cast<int>(100LL * a / (number - 1)) );
if ( ! isPrime(a) ) continue;
long long b = number - a;
if ( b >= a && isPrime(b) )
emit sumFound( tr("%1: %2 + %3").arg(++results).arg(a).arg(b) );
}
return results;
}
long long GoldbachWorker::calculateOddGoldbach(long long number)
{
long long results = 0;
for ( long long a = 2; a < number; ++a )
{
emit this->progressUpdated( static_cast<int>(100LL * a / (number - 1)) );
if ( ! isPrime(a) ) continue;
for ( long long b = a; b < number; ++b )
{
if ( this->isInterruptionRequested() )
return results;
if ( ! isPrime(b) ) continue;
long long c = number - a - b;
if ( c >= b && isPrime(c) )
emit sumFound( tr("%1: %2 + %3 + %4").arg(++results).arg(a).arg(b).arg(c) );
}
}
return results;
}
bool GoldbachWorker::isPrime(long long number)
{
if ( number < 2 ) return false;
long long last = static_cast<long long>( qSqrt( number) );
for ( long long i = 2; i <= last; ++i )
if ( number % i == 0 )
return false;
return true;
}
|