Найти простые числа XOR


16

В этой задаче, поставленной xnor, нас попросили реализовать умножение XOR. В этой задаче цель состоит в том, чтобы найти первые nпростые числа XOR. Простые числа XOR очень похожи на простые простые числа, как вы можете видеть из следующих определений:

Определение простого числа: положительное число больше 1, которое не может быть сформировано путем умножения двух чисел, кроме как умножением 1 и самого себя.

Определение простого числа XOR: положительное число больше 1, которое не может быть сформировано посредством умножения XOR двух чисел, кроме как умножением XOR 1 и самого себя. Обратите внимание, что простые числа XOR составляют последовательность A014580 .

Умножение XOR определяется как двоичное длинное умножение без переноса. Вы можете найти больше информации о умножении XOR в вызове xnor .

Входные данные:

Целое число n.

Выход:

Первые nпростые числа XOR.

Вот простые числа XOR до 500:

2 3 7 11 13 19 25 31 37 41 47 55 59 61 67 73 87 91 97 103 109 115 117 131 137 143 145 157 167 171 185 191 193 203 211 213 229 239 241 247 253 283 285 299 301 313 319 333 351 355 357 361 369 375 379 391 395 397 415 419 425 433 445 451 463 471 477 487 499

7
FWIW это главные элементы уникальной области факторизации F_2[x].
Питер Тейлор

Хм, что именно проблема? Самый короткий код? Самый быстрый код?
Eumel

2
@Eumel Тег является code-golf, поэтому по умолчанию используется самый короткий код в байтах.
Мего

Ответы:


5

Pyth, 26 байт

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

демонстрация

Чтобы проверить, является ли число XOR-простым числом, мы генерируем полную таблицу умножения до этого числа, используя алгоритм отсюда , а затем посчитаем, сколько раз это число появляется. Если это ровно 2, число простое.

Затем .fвозвращает первые n простых чисел.


2

Mathematica, 100 99 байт

F2[Икс]

For[p=i=0,i<#,If[IrreduciblePolynomialQ[++p~IntegerDigits~2~FromDigits~x,Modulus->2],Print@p;i++]]&

2

Пари / ГП , 74 байта

Сохранено 4 байта благодаря Чарльзу .

F2[Икс]

n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--))

Попробуйте онлайн!

В основном так же, как мой ответ Mathematica , но PARI / GP имеет более короткие имена функций.


1
Приятно, улучшение по версии на A014580 . Вы можете сбрить 4 байта , если вы уменьшаете вместо: n->p=0;while(n,if(polisirreducible(Mod(Pol(binary(p++)),2)),print(p);n--)).
Чарльз

1

Цейлон, 166 байт

Конечно, это не может конкурировать с Pyth & Co ...

{Integer*}p(Integer n)=>loop(2)(1.plus).filter((m)=>{for(i in 2:m-2)for(j in 2:m-2)if(m==[for(k in 0:64)if(j.get(k))i*2^k].fold(0)((y,z)=>y.xor(z)))i}.empty).take(n);

отформатирован:

{Integer*} p(Integer n) =>
        loop(2)(1.plus).filter((m) => {
            for (i in 2 : m-2)
                for (j in 2 : m-2)
                    if (m == [
                            for (k in 0:64)
                                if (j.get(k))
                                    i * 2^k
                        ].fold(0)((y, z) => y.xor(z))) i
        }.empty).take(n);

Это создает бесконечную итерацию целых чисел (начиная с 2), фильтрует ее, проверяя, является ли число XOR-простым числом, и берет первые nэлементы этого.

Эта фильтрация работает путем зацикливания всех элементов от 2 до m-1 (которые являются m-2) и проверки каждой пары, если Xor-product дает m. Если созданная этим итерация пуста, mона является xor-простым числом и поэтому включена.

Сам xor-продукт вычисляется с использованием того же алгоритма (и почти того же кода), что и в моем ответе для расчета продукта XOR .


1

Юлия, 116 байт

f(a,b)=b%2*a$(b>0&&f(2a,b÷2))
n->(A=[i=2];while endof(A)<n i+=1;i∈[f(a,b)for a=2:i-1,b=2:i-1]||push!(A,i)end;A[n])

Основной функцией является анонимная функция во второй строке. Он вызывает вспомогательную функцию f(которая, кстати, является моей отправкой для вызова xnor).

Ungolfed:

function xor_mult(a::Integer, b::Integer)
    return b % 2 * a $ (b > 0 && f(2a, b÷2))
end

function xor_prime(n::Integer)
    # Initialize an array to hold the generated XOR primes as well as
    # an index at which to start the search
    A = [i = 2]

    # Loop while we've generated fewer than n XOR primes
    while endof(A) < n
        # Increment the prime candidate
        i += 1

        # If the number does not appear in the XOR multiplication
        # table of all numbers from 2 to n-1, it's an XOR prime
        i  [xor_mult(a, b) for a in 2:i-1, b in 2:i-1] || push!(A, i)
    end

    # Return the nth XOR prime
    return A[n]
end
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.