给定一个积分多项式p,确定p是否是另一个积分多项式的平方。
积分多项式是以整数为系数的多项式。
例如,x^2+2x+1应该给出真相,因为x^2+2x+1 = (x+1)^2。
另一方面,2x^2+4x+2应该给出谎言:2x^2+4x+2 = (\sqrt{2}x+\sqrt{2})^2。但是\sqrt{2}x+\sqrt{2}并不是一个积分多项式。
一个多项式,任何合理的格式。例如,多项式x^4-4x^3+5x^2-2x可以表示为:
[1,-4,5,-2,0];[0,-2,5,-4,1];(coefficient, degree)的列表:[(1,4),(-4,3),(5,2),(-2,1),(0,0)];{4:1,3:-4,2:5,1:-2,0:0};x:"x^4-4*x^3+5*x^2-2*x";x^4-4*x^3+5*x^2-2*x。表示多项式是否为正方形的值。你可以选择
这是密码-高尔夫,所以以字节为单位的最短代码获胜。
在这里,我按降序使用系数列表:
[]
[25]
[1,2,1]
[1,2,1,0,0]
[1,4,0,-8,4]
[4,28,37,-42,9]
[4,0,-4,4,1,-2,1]
[1,-12,60,-160,240,-192,64][-1]
[24,1]
[1,111]
[2,4,2]
[1,2,1,0]
[1,3,3,1]
[1,-4,5,-2,0]
[4,0,-4,4,1,2,1]
[1,-9,30,-45,30,-9,1]发布于 2022-04-25 06:34:32
a=>a.some(n=>(b[j=i]=b.map(m=>n-=m*~~b[j--])|b[0]?n/2/b[0]:n**.5)%(1/a[i+i++]?1:1/0)!=0,b=[],i=0)|1&~i按降序输入系数列表。列表应该只包含一个零,或者列表中的第一个值应该是非零。
我相信这是正确的。但我不能用我的数学知识证明这一点。它至少通过了所有的测试。
发布于 2022-04-25 03:22:40
R=range
def m(a,b):
r={}
for x,y in a:
for j,k in b:r[y+k]=r.get(y+k,0)+x*j
return[(r[i],i)for i in r]
def c(d,k=[]):
if[]==d:yield k;return
for x in R(abs(d[0][0])+1):
for e in R(d[0][1]+1):
for i in[1,-1]:yield from c(d[1:],k+[(i*x,e)])
f=lambda x:any(x==m(i,i)for i in c(x))基本的蛮力。
发布于 2022-04-25 10:02:28
﹪Lθ²F⟦§θ⁰↨θΠ⊗⊕↔θ⟧«≔×⁰↨ι⁴ζFLζ«§≔ζκ¹§≔ζꬋιX↨²ζ²»¿⁻ιX↨²ζ²⎚在网上试试!链接是详细的代码版本。不支持空列表(使用[0]代替)。输出木炭布尔值,即如果-认为多项式是正方形,则不输出。说明:由于@tsh击败了我原来的算法,所以我选择了这种方法,但我只能证明它没有错误的负数。如果有人能想出一个反例,我将删除这个答案,等待使用@tsh的方法重写。编辑:找到了一个反例,但@Nitrodon的说法是,只有奇数度的多项式才能成为反例,所以我花了5个字节来检查多项式是否为偶数。编辑:找到了另一个反例,所以我花了6个字节来检查前导系数是一个完美的平方。
﹪Lθ²如果多项式为偶数度,则输出-。
F⟦§θ⁰↨θΠ⊗⊕↔θ⟧«求出一个非常大的整数,取所有系数的绝对值,递增并加倍,然后取乘积。在此值下计算多项式。对多项式的前导系数和结果进行循环。
≔×⁰↨ι⁴ζFLζ«§≔ζκ¹§≔ζꬋιX↨²ζ²»执行二进制搜索,查找与此值的平方根最近的整数。
¿⁻ιX↨²ζ²⎚如果其平方不等于值,则清除输出。
https://codegolf.stackexchange.com/questions/246526
复制相似问题