Codewars: Gap in Primes


一道5kyu的题。试除。
两点优化:可以剔除掉所有6k,6k-3,6k-4,6k-2,只剩下6k+1和6k-1,步长为6,起始值从第一个6k-1开始,也就是5,上限是sqrt(n);gap为奇数时,由于2是唯一的偶数素数,所以间隔的起始只能是 2。


题目描述:

he prime numbers are not regularly spaced. For example from 2 to 3 the gap is 1. From 3 to 5 the gap is 2. From 7 to 11 it is 4. Between 2 and 50 we have the following pairs of 2-gaps primes: 3-5, 5-7, 11-13, 17-19, 29-31, 41-43

A prime gap of length n is a run of n-1 consecutive composite numbers between two successive primes (see: http://mathworld.wolfram.com/PrimeGaps.html).

We will write a function gap with parameters:

g (integer >= 2) which indicates the gap we are looking for

m (integer > 2) which gives the start of the search (m inclusive)

n (integer >= m) which gives the end of the search (n inclusive)

In the example above gap(2, 3, 50) will return [3, 5] or (3, 5) or {3, 5} which is the first pair between 3 and 50 with a 2-gap.

So this function should return the first pair of two prime numbers spaced with a gap of g between the limits m, n if these numbers exist otherwise nil or null or None or Nothing (depending on the language).

In C++ return in such a case {0, 0}. In F# return [||]. In Kotlin return []

Examples: gap(2, 5, 7) –> [5, 7] or (5, 7) or {5, 7}

gap(2, 5, 5) –> nil. In C++ {0, 0}. In F# [||]. In Kotlin return[]`

gap(4, 130, 200) –> [163, 167] or (163, 167) or {163, 167}

([193, 197] is also such a 4-gap primes between 130 and 200 but it’s not the first pair)

gap(6,100,110) –> nil or {0, 0} : between 100 and 110 we have 101, 103, 107, 109 but 101-107is not a 6-gap because there is 103in between and 103-109is not a 6-gap because there is 107in between.


import math

def EulerSieve(n):
    criterion = math.sqrt(n)
    lst = list(range(3,n,2))
    nlen = len(lst)
    i = 0
    while i < nlen:
        if lst[i] >= criterion:
            break
        base = lst[i]*lst[i]
        j = i+1
        while j < nlen:
            if not lst[j]%lst[i]:
                lst.pop(j)
                nlen -= 1
            j += 1
        i += 1
    lst.insert(0,2)
    return lst

def isPrime(n):
    if n < 6:
        return n == 2 or n==3 or n==5
    if not n&1 or not n%3:  
        return False
    criterion = int(math.sqrt(n))
    for i in range(5,criterion+1,6):  # each 6*k +- 1, 5 is the first 6*k - 1
        if not n%i or not n%(i+2):
            return False
    return True

def gap(g, m, n):
    if g&1:
        if m > 2 or n < g+2: return None
        return [2,2+g] if isPrime(2+g) else None
    j = 0
    for i in range(m|1,n+1,2):
        if isPrime(i):
            if j>0 and i-j==g:
                return [j,i]
            j = i  
    return None

猜你喜欢

转载自blog.csdn.net/qq_35279914/article/details/82190324
GAP
GAP