3n+1的农夫乘法

"""
设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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值