Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Perfect number "Perfect and beautiful objects are always rare, hence we should not expect perfect numbers in abundance". Nicomachos, I/II century author of "Introduction to Arithmetic", Perfect numbers had always been a mystical notion for ancient Greeks and Egyptians and they were assigned miraculous properties. The names of distinguished persons who dealt with perfect numbers are worth mentioning: Pythagoras, Euclid, Nicomachos, St. Augustin, Hudalrichus Regius, Cataldi, Fermat, Mersenne and Euler. So far, 44 perfect numbers are known. Definition Perfect number is a natural number that is the sum of its proper positive divisors. In the above definition a notion of proper divisor was introduced, the notion that is worth knowing in order to fully understand perfect numbers. A proper divisor of n is a positive divisor of n which is different from n. Thus, the smallest perfect number is 6 because 6 = 3 + 2 + 1. The following ones: 28 = 14 + 7 + 4 + 2 + 1, 496 = 1 + 2 + 4 + 8 + 1 6 + 31 + 62 + 124 + 248, 8128= 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 and more: 33550336, 137438691328,... For example, number 27 is not a perfect number as the proper divisors of 27 are numbers: 1, 3, 9 and their sum, 13, does not equal 27. Let’s create an algorithm that will check if a given number is a perfect number. Problem specification Input data: n ϵ N – ends of an interval, n>1. Output data: Perfect numberϵ N. Helper variables: i ϵ N – iteration variable Flowchart Start, sum, give, print, stop The implementation below is an extension of the above algorithm. The program finds perfect numbers in a given interval [a,b] where numbers a,b ϵ N, a > 1 and a < b. Although the program completes the task, the program is not very effective and does not cope with finding larger perfect numbers (exceeding the type int). Source file View/Hide give ends of the interval The program above completes the task quickly and correctly, and finds perfect numbers in the interval [2,10000]. If we extended the interval to 1 000 000, the program would execute approximately 10 times to the power of 12 operations. Thus, an average computer with such defined data would complete this task in about 6 min. Hopefully, the program can be improved so that the task is completed much quicker. Below is a more efficient version of the program perfectn.cpp View/Hide Give ends of the interval As you can see the program has quickened the calculation significantly. To practice, I suggest you try to improve the program perfect2.cpp further and check whether or not the changes quicken the algorithm. Suggestions for the perfect2.cpp improvements: 1. currently: for (int i=2; i*i<=n; i++) if (n%i == 0) sum += i+n/i; change: long double root = sqrt(n); for (int i=2; i<=root; i++) if (n%i == 0) sum += i+n/i; 2. Currently: for (int i=2; i*i<=n; i++) if (n%i == 0) sum += i+n/i; Change: long double root = n; while (fabs(root*root-n)>0.5) root = 0.5*(root+n/root); for (int i=2; i<=root; i++) if (n%i == 0) sum += i+n/i; For the ambitious ones, I recommend an analysis of the outcome of the program perfect3.cpp which measures the time of three algorithms. The algorithms were previously modified in terms of finding a perfect number in a given interval. To notice the difference in time in these algorithms I suggest applying the interval [2,1000000] and waiting. View/Hide Euclidean method First recorded contemplations about perfect numbers appear in Euclidean Elements about 300 BC. There is a theorem that is very essential for our work on perfect numbers. Theorem If we take any finite set of prime numbers the first of which is 1 and each subsequent is two times larger than the preceding one, and add all of them up, then if the product of this addition is a prime number, the number multiplied by a number two times larger than the last one in the set will be a perfect number. The theorem implies that one needs to calculate the sums of subsequent powers of 2, for example 1 + 2 + 4 + 8 +... If any of the sums turns out to be a prime number, one needs to multiply it by the last component which will give us a perfect number. e.g.: 1 + 2 = 22 − 1 = 3 where 3 is a prime number Thus, because 2 · 3 = 6, then 6 is a prime number. 1 + 2 + 4, leads to another perfect number 4 · 7 = 28 etc. It turns out that in this way each perfect number is even. In other words, each even perfect number takes the form: where the first factor of this product is a prime number. So far it is unknown whether there are any odd perfect numbers. Let’s write a program that will use the formula above and find a perfect number. Source code View/Hide // Perfect number Euclidean formula // perfectn4.cpp #include<iostream> #include<cmath> using namespace std; int main() { long long d, p; bool ok=1; for (int i=1; i<50; i++) { ok = 1; p = pow(2.0,i)-1; // checking if number p is a prime number for (int j=2; j<=sqrt(p); j++) if (p%j==0) { ok = 0; break; } if (ok==1) { d=p*pow(2.0,i-1); cout << d << endl; } } return 0; } Outcome of the program Exercise 5.3 View/Hide Write a program that for the first four perfect numbers will check the multiplicative inverse for a number equals 2 e.g. Exercise 5.4 View/Hide Write a program that for the first four perfect numbers will check the following theorem: All even perfect numbers are hexagonal i.e. each of them is a sum of subsequent natural numbers beginning with number 1. E.g. where 3, 7, 31... Mersenne’s prime numbers.