How to resolve the algorithm Long primes step by step in the C# programming language
How to resolve the algorithm Long primes step by step in the C# programming language
Table of Contents
Problem Statement
A long prime (as defined here) is a prime number whose reciprocal (in decimal) has a period length of one less than the prime number.
Long primes are also known as:
Another definition: primes p such that the decimal expansion of 1/p has period p-1, which is the greatest period possible for any integer.
7 is the first long prime, the reciprocal of seven is 1/7, which is equal to the repeating decimal fraction 0.142857142857··· The length of the repeating part of the decimal fraction is six, (the underlined part) which is one less than the (decimal) prime number 7. Thus 7 is a long prime.
There are other (more) general definitions of a long prime which include wording/verbiage for bases other than ten.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Long primes step by step in the C# programming language
The given code in C# implements a program that finds and displays the "long primes" within a specified range and counts their occurrences within certain limits. An integer n is considered a "long prime" if the period of its decimal expansion is equal to n-1.
Here's a detailed explanation of the code:
-
Main Method:
- The
Main
method serves as the program's entry point. - It generates a sequence of prime numbers up to 64000 using the
Primes
method and filters out the first prime (2) usingSkip(1)
. - The primes are then filtered to include only those where the period of their decimal expansion is equal to the prime number minus 1 (
Where(p => Period(p) == p - 1)
). - The sequence is finally extended by adding a prime (99999) as a sentinel value.
- The
-
Console Output:
- The
Main
method prints the first 500 primes from the generated sequence. - It also counts the number of long primes below different limits and prints this count at those limits (initially set to 500, doubling each time).
- The
-
Period
Method:- This method calculates the period of the decimal expansion of an integer
n
. - It starts with an initial remainder
r
of 1 and iterates untilr
becomes equal to the initial remainder again. - The number of iterations required to reach this point is the period.
- This method calculates the period of the decimal expansion of an integer
-
SomePrimeGenerator
Class:- This class contains a static method
Primes
that generates prime numbers up to a specified limit. - It uses the Sieve of Eratosthenes algorithm to mark non-prime numbers within an array
flags
. - Prime numbers are then yielded from the sequence.
- This class contains a static method
-
Program Output:
- The program prints the first 500 long primes, along with the counts of long primes below various limits (such as 500, 1000, 2000, etc.).
In summary, this program finds and counts "long primes" (prime numbers where the period of their decimal expansion equals the prime number minus 1) within a specified range. It also prints the count of these primes below certain limits and provides the first 500 long primes found.
Source code in the csharp programming language
using System;
using System.Collections.Generic;
using System.Linq;
public static class LongPrimes
{
public static void Main() {
var primes = SomePrimeGenerator.Primes(64000).Skip(1).Where(p => Period(p) == p - 1).Append(99999);
Console.WriteLine(string.Join(" ", primes.TakeWhile(p => p <= 500)));
int count = 0, limit = 500;
foreach (int prime in primes) {
if (prime > limit) {
Console.WriteLine($"There are {count} long primes below {limit}");
limit *= 2;
}
count++;
}
int Period(int n) {
int r = 1, rr;
for (int i = 0; i <= n; i++) r = 10 * r % n;
rr = r;
for (int period = 1;; period++) {
r = (10 * r) % n;
if (r == rr) return period;
}
}
}
}
static class SomePrimeGenerator {
public static IEnumerable<int> Primes(int lim) {
bool [] flags = new bool[lim + 1]; int j = 2;
for (int d = 3, sq = 4; sq <= lim; j++, sq += d += 2)
if (!flags[j]) {
yield return j; for (int k = sq; k <= lim; k += j)
flags[k] = true;
}
for (; j<= lim; j++) if (!flags[j]) yield return j;
}
}
You may also check:How to resolve the algorithm Sequence of primorial primes step by step in the Racket programming language
You may also check:How to resolve the algorithm Linear congruential generator step by step in the 360 Assembly programming language
You may also check:How to resolve the algorithm Cartesian product of two or more lists step by step in the D programming language
You may also check:How to resolve the algorithm List comprehensions step by step in the Erlang programming language
You may also check:How to resolve the algorithm Fusc sequence step by step in the Vala programming language