查找XOR素数


16

在xnor提出的挑战中,我们被要求实现XOR乘法。在这一挑战中,目标是找到第一个nXOR素数。从以下定义可以看出,XOR素数与常规素数非常相似:

质数的定义:大于1的正数,除非将1与自身相乘,否则不能通过将两个数相乘而形成。

XOR质数的定义:大于1的正数,除非通过1与自身的XOR乘积,否则不能通过两个数的XOR乘积来形成。注意,XOR质数组成oeis序列A014580

XOR乘法定义为不带进位的二进制长乘法。您可以在xnor的Challenge中找到有关XOR乘法的更多信息。

输入:

一个整数n

输出:

第一个nXOR素数。

以下是500以下的XOR素数:

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 2015年

2
@Eumel标签是代码高尔夫,因此默认的最短代码(以字节为单位)。
Mego 2015年

Answers:


5

Pyth,26个字节

.fq2/muxyG*Hhdjed2 0^SZ2ZQ

示范

为了测试数字是否为XOR质数,我们使用here的算法生成一个直至该数字的完整乘法表,然后计算该数字出现多少次。如果正好是2,则该数字为质数。

然后, .f返回前n个素数。


2

Mathematica, 100 99字节

F2[X]

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

2

Pari / GP,74字节

由于Charles节省了4个字节。

F2[X]

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。如果创建的iterable为空,m则为xor-prime,因此包含在内。

异或乘积本身是使用与我的异或乘积计算答案相同的算法(和几乎相同的代码)来计算的


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.