"""
设x为大于一的奇数,
用一个3**b的数乘以它得结果k。
x*(3**b)=k, 且令 y=(3**b),prod=0
collatz的农夫算法:
假如x是奇数,则进行 x=x*3+1
y/=3
prod-=y
那么依然 x*y +prod=k
假如x是偶数,则进行 x=x/2
y=y*2
prod+=0
那么依然 x*y +prod=k
不断进行如上运算。
假如y中的t足够多,且collatz可以成立,那么
这个农夫算法就最终达到
x=1, y=2**a ,prod 是一个严格的2^i↑x3^j↓的数列之和的负值,
(其中指数j只能按照-1的等差方式下降,不能忽多忽少。)
也就是 2**a + prod = k
= x*(3**b)
类似prod 的不严格 N:= ∑2^i↑x3^j↓,且i≥0,j≥0 称之
为任意正整数 N的 (???)合法表示法。我不知道原创者怎么命名它。
但是我称之为'兄弟'表示法,因为动漫里233是兄弟。其中ij可以有加速度。
有人证明了任意正整数都可以用兄弟表示法来表示,并证明了
对于任意正整数x 都有 2**a - x*(3**b)= brother = (-prod ??)
collatz的农夫prod 是个严格的兄弟表示法。所以证明只证明了
猜想的"一半"。
"""
def collatz_peasant_mult(x,t):
y=3**t
prod=0
print(x*y)
while x>1:
print(x,y,prod)
if x%2==1:
x=x*3+1
y=y/3
prod-=y
else:
x=x//2
y=y*2
print(x,y,prod)
print(y+prod)
collatz_peasant_mult(7,3)
"""
下面是我没看到农夫乘法之前的编程,其实差不多。
"""
#__________________________
def yap(n,z=2):
i=0
while n>1 and n % z ==0:
n //=z
i+=1
return i,n
##__________________________
def clz(n):
le23=[]
index3=0
index2=0
if n<1 or not isinstance(n,int):return None
if n%2==0:
print("◆◆◆◆\n",n)
i,n=yap(n)
index2+=i
le23+=[(index2,0)]
else:
print("◇◆◆◆\n",n)
while n >1:
n=n*3+1
index3-=1
le23+=[(index2,index3)]
i,n=yap(n)
index2+=i
print(n)
le23+=[(index2,index3)] #最终一步
return le23
#__________________________
ts=7
v=clz(ts)
#__________________________
m=v[-2][1]
z=v[-1][0],-v[-1][1]
br23=[(i[0],i[1]-m) for i in v[0:-1]]
print('prod23 = '+str(br23)+'\n')
start=str(ts)+'*3^'+str(z[1])
end='2^'+str(z[0])
print(start+' + prod23 = '+end+'\n')
##__________________________
#brc=0
#for i in br23:
#brc+=(2**i[0])*(3**i[1])
def c2i3j(p):
return (2**p[0])*(3**p[1])
brc=sum(map(c2i3j,br23))
strt=ts*(3**z[1])
print(strt+brc)
3n+1的农夫乘法
最新推荐文章于 2023-03-06 23:06:22 发布