How to create the most compact mapping n → isprime(n) up to a limit N?

后端 未结 30 2663
遇见更好的自我
遇见更好的自我 2020-11-22 02:11

Naturally, for bool isprime(number) there would be a data structure I could query.
I define the best algorithm, to be the algorithm that pr

相关标签:
30条回答
  • 2020-11-22 02:52

    Smallest memory? This isn't smallest, but is a step in the right direction.

    class PrimeDictionary {
        BitArray bits;
    
        public PrimeDictionary(int n) {
            bits = new BitArray(n + 1);
            for (int i = 0; 2 * i + 3 <= n; i++) {
                bits.Set(i, CheckPrimality(2 * i + 3));
            }
        }
    
        public PrimeDictionary(IEnumerable<int> primes) {
            bits = new BitArray(primes.Max());
            foreach(var prime in primes.Where(p => p != 2)) {
                bits.Set((prime - 3) / 2, true);
            }
        }
    
        public bool IsPrime(int k) {
            if (k == 2) {
                return true;
            }
            if (k % 2 == 0) {
                return false;
            }
            return bits[(k - 3) / 2];
        }
    }
    

    Of course, you have to specify the definition of CheckPrimality.

    0 讨论(0)
  • 2020-11-22 02:52

    You could try something like this.

    def main():
        try:
            user_in = int(input("Enter a number to determine whether the number is prime or not: "))
        except ValueError:
            print()
            print("You must enter a number!")
            print()
            return
        list_range = list(range(2,user_in+1))
        divisor_list = []
        for number in list_range:
            if user_in%number==0:
                divisor_list.append(number)
        if len(divisor_list) < 2:
            print(user_in, "is a prime number!")
            return
        else:
            print(user_in, "is not a prime number!")
            return
    main()
    
    0 讨论(0)
  • 2020-11-22 02:52
    bool isPrime(int n) {
    if(n <= 3)
        return (n > 1)==0? false: true;
    else if(n%2 == 0 || n%3 == 0)
        return false;
    
    int i = 5;
    
    while(i * i <= n){
        if(n%i == 0 || (n%(i+2) == 0))
            return false;
        i = i + 6;
    }
    
    return true;
    }
    

    for any number, the minimum iterations to check if the number is prime or not can be from 2 to square root of the number. To reduce the iterations, even more, we can check if the number is divisible by 2 or 3 as maximum numbers can be eliminated by checking if the number is divisible by 2 or 3. Further any prime number greater than 3 can be expressed as 6k+1 or 6k-1. So the iteration can go from 6k+1 to the square root of the number.

    0 讨论(0)
  • 2020-11-22 02:54

    Similar idea to the AKS algorithm which has been mentioned

    public static boolean isPrime(int n) {
    
        if(n == 2 || n == 3) return true;
        if((n & 1 ) == 0 || n % 3 == 0) return false;
        int limit = (int)Math.sqrt(n) + 1;
        for(int i = 5, w = 2; i <= limit; i += w, w = 6 - w) {
            if(n % i == 0) return false;
            numChecks++;
        }
        return true;
    }
    
    0 讨论(0)
  • 2020-11-22 02:54

    To find if the number or numbers in a range is/are prime.

    #!usr/bin/python3
    
    def prime_check(*args):
        for arg in args:
            if arg > 1:     # prime numbers are greater than 1
                for i in range(2,arg):   # check for factors
                    if(arg % i) == 0:
                        print(arg,"is not Prime")
                        print(i,"times",arg//i,"is",arg)
                        break
                else:
                    print(arg,"is Prime")
                    
                # if input number is less than
                # or equal to 1, it is not prime
            else:
                print(arg,"is not Prime")
        return
        
    # Calling Now
    prime_check(*list(range(101)))  # This will check all the numbers in range 0 to 100 
    prime_check(#anynumber)         # Put any number while calling it will check.
    
    0 讨论(0)
  • 2020-11-22 02:54

    With help of Java-8 streams and lambdas, it can be implemented like this in just few lines:

    public static boolean isPrime(int candidate){
            int candidateRoot = (int) Math.sqrt( (double) candidate);
            return IntStream.range(2,candidateRoot)
                    .boxed().noneMatch(x -> candidate % x == 0);
        }
    

    Performance should be close to O(sqrt(N)). Maybe someone find it useful.

    0 讨论(0)
提交回复
热议问题