Знайдіть Примери XOR


16

У цьому виклику, поставленому xnor, нас попросили реалізувати множення XOR. Мета цього завдання полягає в тому, щоб знайти перші nпраймери XOR. Праймери XOR дуже схожі на звичайні праймери, як ви можете бачити за такими визначеннями:

Визначення простого числа: Позитивне число, що перевищує 1, яке не може бути утворене шляхом множення двох чисел, за винятком множення 1 і самого себе.

Визначення XOR Prime: Позитивне число, що перевищує 1, яке не може бути сформовано шляхом множення XOR на два числа, за винятком множення XOR на 1 та себе. Зауважимо, що праймери XOR складають oeis послідовність 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].
Пітер Тейлор

Гм, що саме є викликом? Найкоротший код? Найшвидший код?
Евмель

2
@Eumel Тег - код-гольф, тому за замовчуванням найкоротший код у байтах.
Мего

Відповіді:


5

Pyth, 26 байт

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

Демонстрація

Щоб перевірити, чи є число простим XOR, ми генеруємо повну таблицю множення до цього числа за допомогою алгоритму звідси , а потім підраховуємо, скільки разів це число з’являється. Якщо це точно 2, число є простим.

Потім .fповертає перші п.


2

Математика, 100 99 байт

Як зазначає xnor, множення XOR є просто множенням у поліномному кільці Ж2[х] .

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

2

Парі / GP , 74 байти

Збережено 4 байти завдяки Чарльзу .

Як зазначає xnor, множення XOR є просто множенням у поліномному кільці F 2 [ x ]Ж2[х]

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-продукт 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).

Безголівки:

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.