CS 670, Homework 2. Due: Tuesday, January 22 at 11:59pm. Points: 20 HW points. For questions (1), (2), (4) - put those answers in your .txt file. For qeustions (3) - create those programs and leave them in ~yourusername/cs670/handin/ (1) Name: (2) List anyone that you talked to or worked with on your HW. Remember to review the policy in the syllabus on collaborating on HW's. Collaborators: (3) Modify your perfectCount program as follows. (a) If you had mistakes with not locking updates to shared variables, fix those mistakes. (b) Rename the program perfectCount.cpp, and convert all the long long int's to be mpz_class GMP variables. See factorOpenMP4.cpp for how to do this. Now the program should work for arbitrarily large numbers. (c) Rather than testing all numbers, only test numbers that are of the form 2^(p-1)*(2^p - 1). These numbers are prime precisely when 2^p - 1 is prime, and there are conjectures stating that all perfect numbers are of this form. So, rather than testing 2, 3, 4, ... if each is prime, instead do the following. For p=2, 3, 4, ..., test if 2^p - 1 is prime. If it is, then conclude that 2^(p-1) * (2^p - 1) is perfect. For more on this formula for perfect numbers, check the wikipedia article on perfect numbers. Still make your program so that it tests numbers up to the command line argument that is given, but you will only test numbers of the special form just mentioned. So it will still be the case that ./perfectCount 30 will say 2, and ./perfectCount 10000 will say 4. But we should be able to go to much higher numbers. The program should continue to use multiple threads using OpenMP. (4) For your program from (), what is the largest value of n (a) where your program finishes in 1 second, (b) where your program finishes in 10 seconds, (c) where your program finishes in 1 minute? And what are the counts returned for those values of n?