コードだけ先に…
def nikou(a,d=[]):
dd=[]
#print(a,len(a),d)
if len(a)==1:
if len(d)==0:
return [a]
for i in range(len(d)):
dd+=[a+d[i],d[i]]
return dd
else:
#print(a,len(a),d)
if len(d)==0:
return nikou(a[:-1],[[a[-1]]])
ee=[]
for i in range(len(d)):
ee+=[d[i]+[a[-1]],d[i]]
ee+=[[a[-1]]]
dd+=nikou(a[:-1],ee)
return dd
def kannibunkai(a):
b=abs(a)
ls=[]
for i in range(2,100):
while b>1 and b%i==0:
ls+=[i]
b//=i
if b>1:
ls+=[b]
return ls
?def kougo1(a):
ls=kannibunkai(a+(a+1))
ls+=[1]
ls=nikou(ls)
kls=[np.prod(ls[i]) for i in range(len(ls))]
tuikls=[((a*2+1)//kls[i]) for i in range(len(kls))]
ret=[]
for i in range(len(kls)):
if kls[i]*tuikls[i]>2*a+1:
continue
ret+=[[kls[i]//2,tuikls[i]//2]]
return ret
def kougo2(als):
ret=[]
for i in range(len(als)):
k=(4*als[i][0]+1)*(4*als[i][1]+1)
if all([ret[j][0]!=k for j in range(len(ret))])==True:
ret+=[(k,[(4*als[i][0]+1),(4*als[i][1]+1)])]
return ret
def kougo3(n):
ret=[]
for i in range(100):
for j in range(i,100):
l=(2*i+1)*(2*j+1)
m=4*(i+j)+2
o=kaihei(n//l,2)[1]
if o>0 and n%l==(o*m+1)%l:
print(2*i+1,2*j+1,l,m,o)
print(o*(2*i+1)+1,o*(2*j+1)+1,(o**2*(2*i+1)*(2*j+1))-n)
mamari=(o**2*(2*i+1)*(2*j+1))-n
if mamari%(m//2)==1:
q=(mamari-1)//(m//2)
print((o*(q*i+1)+1)*(o*(q*j+1)+1),o*(q*i+1)+1,o*(q*j+1)+1,'matched')
if mamari%(m//2)==(-1)%(m//2):
q=(mamari+1)//(m//2)
print((o*(q*i+1)-1)*(o*(q*j+1)-1),o*(q*i+1)-1,o*(q*j+1)-1,'matched')
コードだけ先に載せます。説明は時間ができたら書きます。まだコードの意味がよく把握しきれていない。nikouは二項定理に従ってn個の選択肢の組み合わせを列挙するためのプログラムなので、数字の入れ方によっては無茶苦茶重くなることがあるのに注意。
この記事が気に入ったらサポートをしてみませんか?