Создание сетки на основе простых чисел - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над построением сетки 1000 x 1000, где белый квадрат представляет собой не простое число, а черный квадрат представляет собой простое число.

Как это должно выглядеть, это отображение большой сеткицифры 0-1 000 000 и затемнение любого квадрата, где простое число (таким образом, на первом и втором квадратах он белый (0 и 1), а третий и четвертый квадрат - черный (2 и 3) и т. д.).Вплоть до 1 000 000

Мой код пока:

Импорт

from math import sqrt, ceil
import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np

Создание списка простых чисел

def all_prime(n):
    # /2029352/samyi-bystryi-sposob-perechislit-vse-prostye-chisla-nizhe-n#2029364
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
    return [2] + [i for i in range(3,n,2) if sieve[i]]

Фактическое построение графика

def prime_plot(n):
    '''
    Takes on argument (n), which is a number > 2 and produces a list of all primes up to n.
    Will then show on a plot the primes vs all numbers in range n.
    '''

    x = all_prime(n)
    y = list(range(n))

    data = np.random.rand(10, 10) * 20

    cmap = colors.ListedColormap(['white', 'black'])
    bounds = [0,10,20]
    norm = colors.BoundaryNorm(bounds, cmap.N)

    fig, ax = plt.subplots()
    ax.imshow(data, cmap=cmap, norm=norm)

    # draw gridlines
    ax.grid(which='major', axis='both', linestyle='-', color='k', linewidth=2)
    ax.set_xticks(np.arange(0, 10, 1));
    ax.set_yticks(np.arange(0, 10, 1));

    plt.show()

prime_plot(100)  

Хотя я собираюсь создать сетку размером mxm (где m - это sqrt (len (n)), я хочуначать с создания сетки статического размера.

Как я могу изменить приведенный выше код, чтобы создать то, что я хочу. Большие сетки выглядят очень грязно с matplotlib.

При изменении данныхиспользовать списки Я получаю TypeError: невозможно преобразовать данные изображения в число с плавающей точкой

data = (x, y)

Как мне нужно преобразовать списки x и y в то, что мне нужно (вместо случайно сгенерированных чисел)

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Полагаю, идея состояла бы в том, чтобы создать массив нулей (значение «не простое число») и установить в нем те значения 1, где у вас есть простое число.Затем вам нужно изменить форму массива в сетку NxN.

import matplotlib.pyplot as plt
import numpy as np

def all_prime(n):
    # /2029352/samyi-bystryi-sposob-perechislit-vse-prostye-chisla-nizhe-n
    #primes-below-n-in-python/3035188#3035188
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
    return [2] + [i for i in range(3,n,2) if sieve[i]]

def prime_plot(n):
    '''
    Takes on argument (n), which is a number > 2 and produces a list of all primes up to n.
    Will then show on a plot the primes vs all numbers in range n.
    '''
    N = int(np.sqrt(n))
    if N*N != n:
        raise ValueError("Need a square grid.")

    primes = np.array(all_prime(n)).astype(int)
    data = np.zeros(n)
    data[primes] = 1
    data = data.reshape(N,N)

    fig, ax = plt.subplots()
    ax.imshow(data, cmap="gray_r")

    for p in primes:
        ax.text(p%N, p//N, p, color="w", ha="center", va="center")

    plt.show()

prime_plot(100)

enter image description here

0 голосов
/ 09 декабря 2018

Большие сетки выглядят очень грязно с matplotlib.

Ради интереса, я решил попробовать реализовать вашу программу с использованием Python turtle.Также для практики программирования я превратил all_prime() в генератор:

from turtle import Screen, Turtle

LIMIT = 100
SQUARE_SIZE = 40

def all_prime(n):
    """ Returns  a list of primes < n """

    # /2029352/samyi-bystryi-sposob-perechislit-vse-prostye-chisla-nizhe-n
    # primes-below-n-in-python/3035188#3035188

    yield 2

    sieve = [True] * n

    for i in range(3, int(n ** 0.5) + 1, 2):
        if sieve[i]:
            sieve[i * i::2 * i] = [False] * ((n - i * i - 1) // (2 * i) + 1)

    yield from (i for i in range(3, n, 2) if sieve[i])

FONT_SIZE = SQUARE_SIZE // 2
FONT = ('Arial', FONT_SIZE, 'normal')
CURSOR_SIZE = 20
BORDER = SQUARE_SIZE
ROOT = int(LIMIT ** 0.5)

screen = Screen()
screen.setup(ROOT * SQUARE_SIZE + BORDER * 2, ROOT * SQUARE_SIZE + BORDER * 2)
screen.setworldcoordinates(-1, ROOT + 1, ROOT + 1, -1)

turtle = Turtle("square", visible=False)
turtle.penup()
turtle.goto((ROOT + 2) / 2 - 1, (ROOT + 2) / 2 - 1)

turtle.shapesize((ROOT * SQUARE_SIZE) / CURSOR_SIZE)
turtle.color("black", "white")
turtle.stamp()  # border

turtle.shapesize(SQUARE_SIZE / CURSOR_SIZE)
turtle.color("white", "black")

primes = all_prime(LIMIT)

try:
    prime = next(primes)

    for y in range(ROOT):

        if not prime:
            break

        for x in range(ROOT):

            if prime == (y * ROOT) + x:
                turtle.goto(x + 0.5, y + 0.5)
                turtle.stamp()

                turtle.sety(y + 0.5 + FONT_SIZE / SQUARE_SIZE / 2)
                turtle.write(prime, align="center", font=FONT)

                prime = next(primes)

except StopIteration:
    pass

screen.mainloop()

enter image description here

0 голосов
/ 06 декабря 2018

Для генерации праймерных чисел вы можете использовать eulerlib: https://pypi.org/project/eulerlib/ Эта библиотека очень полезна при работе с простыми числами.

...