平衡九进制

    技术2022-05-20  56

    想来想去还是把名字改成平衡九进制好,

    平衡三进制的名字已经在网上了,

    也省的我再乱命名, github上放了一份 ..https://github.com/jiyinyiyong/shuangsan0

    之前的内容只能到我的网易博客看了,

    怕转过来链接csdn把把我的博客封掉,,

    进入正题,

    平衡九进制数的图形展示是一个九宫格,

    分别填入数字:

    6  1  8

    7  5  3

    2  9  4

    然后每一个格子可以扩展细分成新的九宫格,

    最大的一层可以往外延伸,,

    这些直接从自然数推就可以了,,

    也可以参照wiki上面的平衡三进制,

    总的说两者就是高维低维的对应,

    再往上就平衡八十一进制了,偶数嘛,

    实际的用处不多,

    虽然用来指明方向非常直观,

    但是现在没人用,我一个人说也不算,

    符号计算法则跟自然数相似,

    也就是后面的重点,

    另外的只能到博客看了,要不看下面源码,

    我对自己的源码没多少信心,,

    思路大概这样的,,

    首先最简单的加法乘法结果可以从平面当中读出来,

    所以使用了列表索引,

    然后加法和乘法都是将每一对符号相乘的结果分开保存再两个数组,

    一个周期结束之后收集累加,

    加法累加之后循环累加直到进位消失,

    乘法就直接调用加法了,

    减法就是取相反数然后执行加法,简单的,

    除法最麻烦,

    我最后的办法是暴力运算,

    结果的每一位都选取9个数字尝试,

    每位数乘以除数到的乘积,

    然后通过共轭再次乘积对比得到离被除数最近的一个点,

    然后确定数值然后累加到结果,

    最后一步步得到结果,,

    所以乘法的次数相当多,速度慢,

    相信没有别的好办法了在目前的认识水平,,

    然后那个loop_mark的数值可以增大,

    会更精确,更慢..

    文件是:同个目录的luo和shu两个模块.

    源码如下,,python 2.7.1 gcc4.5

    from luo import see from shu import look import string def shape(a): if a.find('.')!=-1: while a[0]=='5':a=a[1:] while a[-1]=='5':a=a[:-1] if a[0]=='.': b='5' for i in a: b+=i a=b if a[-1]=='.':a=a[:-1] return a elif a == '' : print 'error' return 'error' elif len(a) == 1 : return a else : while a [0] == '5' : a = a [1:] if a =='5' : break return a def plus(va,vb): app=va.find('.') ap=app if ap==-1:ap=len(va) bpp=vb.find('.') bp=bpp if bp==-1:bp=len(vb) if ap>bp:l=ap else:l=bp ar=len(va)-ap-1 if app==-1:ar=0 br=len(vb)-bp-1 if bpp==-1:br=0 if ar>br:m=ar else:m=br n=l+m+1 a=['5']*n b=['5']*n afor=l-ap+1 for i in va: if i!='.': a[afor]=i afor+=1 bfor=l-bp+1 for i in vb: if i!='.': b[bfor]=i bfor+=1 pab=l+1 chck=['5']*n up=a rsl=b while up!=chck: a=up b=rsl up=['5']*n rsl=['5']*n for i in range(n): i+=1 out=see(a[-i],b[-i]) if out=='error': print 'see .. crashed as supposed ' exit() rsl[-i]=out[1] if out[0]!='5':up[-i-1]=out[0] re='' j=0 for i in range(n): re+=rsl[i] if j==l:re+='.' j+=1 return shape(re) def minus(va,vb): vvb='' for i in vb: if i!='.':vvb+=str(10-string.atoi(i)) else:vvb+='.' return plus(va,vvb) def multiply(va,vb): ap=va.find('.') if ap==-1: al=len(va) ar=0 else: al=ap ar=len(va)-ap-1 bp=vb.find('.') if bp==-1: bl=len(vb) br=0 else: bl=bp br=len(vb)-bp-1 n=al+bl+ar+br rsl='5' afor=0 bfor=0 for i in va: if i!='.': re=['5']*n up=['5']*n bfor=0 afor+=1 for j in vb: if j!='.': ab=afor+bfor out=look(i,j) re[ab]=out[1] up[ab-1]=out[0] bfor+=1 vi=0 red='' for ai in re: if vi==al+bl:red+='.' red+=ai vi+=1 re=red vi=0 upd='' for ai in up: if vi==al+bl:upd+='.' upd+=ai vi+=1 up=upd rsl=plus(rsl,re) rsl=plus(rsl,up) return shape(rsl) def divide(va,vb): ap=va.find('.') # now begins the part for quotient def conjugate (the_num) : the_conjugate = '' for item in the_num : if item == '5' : the_conjugate += '5' elif item == '.' : the_conjugate += '.' elif item == '1' : the_conjugate += '1' elif item == '2' : the_conjugate += '4' elif item == '3' : the_conjugate += '7' elif item == '4' : the_conjugate += '2' elif item == '6' : the_conjugate += '8' elif item == '7' : the_conjugate += '3' elif item == '8' : the_conjugate += '6' elif item == '9' : the_conjugate += '9' else : return 'conjugate Error!!' return the_conjugate # main part of quotient def divide (num_one,num_two) : num_one = shape (num_one) num_two = shape (num_two) if num_two == '5' : print 'it maybe .. type in whatever charactor you like:' like = raw_input () print 'so .. i have to say the result is' , like print 'exit with fear' exit() #print num_one , num_two if num_one.find ('.') == -1 : integer_one = len (num_one) else : integer_one = num_one.find ('.') if num_two.find ('.') == -1 : fractional_two = 0 else : fractional_two = len(num_two) - num_two.find('.') #print '/n' , integer_one , fractional_two guess_bits = integer_one + fractional_two + 5 loop_mark = 0 result = '5' while num_one!='5' and loop_mark<24 : #print 'begins while' loop_mark += 1 guess_bits -= 1 if guess_bits > 0 : num_head = '1' for item in range (2,guess_bits) : num_head +='5' elif guess_bits < 0 : num_head = '5.' for item in range (1, -guess_bits) : if item != 1 : num_head += '5' num_head += '1' else : num_head = '1' #print 'num_head' , num_head ,'/t', #print 'num_one in while' , num_one ,'/t', #print 'num_two' , num_two ,'/t' i_char = ['']*9 i_num = ['']*9 i_product = ['']*9 i_difference = ['']*9 i_conjugate = ['']*9 i_modulus = ['']*9 for item in range (9) : i_char [item] = str ( item+1 ) #print 'i_char' , i_char [item] ,'/t', i_num [item] = multiply ( num_head , i_char[item] ) #print 'i_num' , i_num [item] ,'/t', i_product [item] = multiply ( num_two , i_num[item] ) #print 'i_product' , i_product [item] ,'/t', i_difference [item] = minus ( num_one , i_product[item] ) #print 'i_difference' , i_difference[item] , '/t', i_conjugate [item] = conjugate ( i_difference[item] ) i_modulus [item] = multiply ( i_difference[item] , i_conjugate[item] ) #print 'i_modulus' , i_modulus [item] min_char = i_char [0] min_difference = i_difference [0] min_modulus = i_modulus [0] min_num = i_num [0] for item in range (1,9) : modulus_difference = minus ( i_modulus[item] , min_modulus ) #print 'modulus_difference' , modulus_difference , 'checked' , item+1 if modulus_difference [0] == '1' : continue elif modulus_difference [0] == '9' : min_char = i_char [item] min_num = i_num [item] min_difference = i_difference [item] min_modulus = i_modulus [item] elif modulus_difference == '5' : continue else : #print modulus_difference ,'/t', modulus_difference = modulus_difference [2:] #print modulus_difference while modulus_difference [0] == '5' : modulus_difference = modulus_difference [1:] if modulus_difference [0] == '1' : continue elif modulus_difference [0] == '9' : min_char = i_char [item] min_num = i_num [item] min_difference = i_difference [item] min_modulus = i_modulus [item] else : print 'another can/'t believe!!' #print min_char #print min_difference num_one = min_difference #print 'num_one :' , num_one #print 'min_mun :' , min_num result = plus ( result , min_num ) #print 'ends while/n' return result while True : print '/n>>>', command = raw_input () seek_plus = command.find ('+') seek_minus = command.find ('-') seek_multiply = command.find ('*') seek_divide = command.find ('/') if command == 'q' : print '/t/t/tbye ~' exit() elif command == 'help' : print "/t/t'q'/tto quit" print "/t/tonly '+' '-' '*' '/' '.' and number 1~9 in the right range will be responsed successfully" print "/t/tfor more details please visit jiyinyiyong.blog.163.com" print "/t/tanyway , i'm not able to make it right in every aspect , still some hidden problems uncoverd .." print "/t/tchecked in Python 2.7.1+/tand/tGCC 4.5.2 linux2" elif seek_plus != -1 : number_a = command [ :seek_plus ] number_b = command [ seek_plus+1 : ] response = plus ( number_a , number_b ) print 'sum:/t' , response elif seek_minus != -1 : number_a = command [ :seek_minus ] number_b = command [ seek_minus+1 : ] response = minus ( number_a , number_b ) print 'difference:/t' , response elif seek_multiply != -1 : number_a = command [ :seek_multiply ] number_b = command [ seek_multiply+1 :] response = multiply ( number_a , number_b ) print 'product:/t' , response elif seek_divide != -1 : number_a = command [ :seek_divide ] number_b = command [ seek_divide+1 : ] response = divide ( number_a , number_b ) print 'quotient:/t' , response else : print 'pardon ?'  

    luo.py

    def see(a,b): if a=='1': if b=='1':return '19' elif b=='2':return '57' elif b=='3':return '58' elif b=='4':return '53' elif b=='5':return '51' elif b=='6':return '12' elif b=='7':return '56' elif b=='8':return '14' elif b=='9':return '55' else:return 'error' elif a=='2': if b=='1':return '57' elif b=='2':return '28' elif b=='3':return '59' elif b=='4':return '91' elif b=='5':return '52' elif b=='6':return '73' elif b=='7':return '74' elif b=='8':return '55' elif b=='9':return '96' else:return 'error' elif a=='3': if b=='1':return '58' elif b=='2':return '59' elif b=='3':return '37' elif b=='4':return '32' elif b=='5':return '53' elif b=='6':return '51' elif b=='7':return '55' elif b=='8':return '36' elif b=='9':return '54' else:return 'error' elif a=='4': if b=='1':return '53' elif b=='2':return '91' elif b=='3':return '32' elif b=='4':return '46' elif b=='5':return '54' elif b=='6':return '55' elif b=='7':return '59' elif b=='8':return '37' elif b=='9':return '98' else:return 'error' elif a=='5': if b=='1':return '51' elif b=='2':return '52' elif b=='3':return '53' elif b=='4':return '54' elif b=='5':return '55' elif b=='6':return '56' elif b=='7':return '57' elif b=='8':return '58' elif b=='9':return '59' else:return 'error' elif a=='6': if b=='1':return '12' elif b=='2':return '73' elif b=='3':return '51' elif b=='4':return '55' elif b=='5':return '56' elif b=='6':return '64' elif b=='7':return '78' elif b=='8':return '19' elif b=='9':return '57' else:return 'error' elif a=='7': if b=='1':return '56' elif b=='2':return '74' elif b=='3':return '55' elif b=='4':return '59' elif b=='5':return '57' elif b=='6':return '78' elif b=='7':return '73' elif b=='8':return '51' elif b=='9':return '52' else:return 'error' elif a=='8': if b=='1':return '14' elif b=='2':return '55' elif b=='3':return '36' elif b=='4':return '37' elif b=='5':return '58' elif b=='6':return '19' elif b=='7':return '51' elif b=='8':return '82' elif b=='9':return '53' else:return 'error' elif a=='9': if b=='1':return '55' elif b=='2':return '96' elif b=='3':return '54' elif b=='4':return '98' elif b=='5':return '59' elif b=='6':return '57' elif b=='7':return '52' elif b=='8':return '53' elif b=='9':return '91' else:return 'error' else:return 'error'  

    shu.py

    def look(a,b): if a=='1': if b=='1':return '51' elif b=='2':return '52' elif b=='3':return '53' elif b=='4':return '54' elif b=='5':return '55' elif b=='6':return '56' elif b=='7':return '57' elif b=='8':return '58' elif b=='9':return '59' else:return 'error' elif a=='2': if b=='1':return '52' elif b=='2':return '37' elif b=='3':return '56' elif b=='4':return '19' elif b=='5':return '55' elif b=='6':return '91' elif b=='7':return '54' elif b=='8':return '73' elif b=='9':return '58' else:return 'error' elif a=='3': if b=='1':return '53' elif b=='2':return '56' elif b=='3':return '59' elif b=='4':return '52' elif b=='5':return '55' elif b=='6':return '58' elif b=='7':return '51' elif b=='8':return '54' elif b=='9':return '57' else:return 'error' elif a=='4': if b=='1':return '54' elif b=='2':return '19' elif b=='3':return '52' elif b=='4':return '73' elif b=='5':return '55' elif b=='6':return '37' elif b=='7':return '58' elif b=='8':return '91' elif b=='9':return '56' else:return 'error' elif a=='5': return '55' elif a=='6': if b=='1':return '56' elif b=='2':return '91' elif b=='3':return '58' elif b=='4':return '37' elif b=='5':return '55' elif b=='6':return '73' elif b=='7':return '52' elif b=='8':return '19' elif b=='9':return '54' else:return 'error' elif a=='7': if b=='1':return '57' elif b=='2':return '54' elif b=='3':return '51' elif b=='4':return '58' elif b=='5':return '55' elif b=='6':return '52' elif b=='7':return '59' elif b=='8':return '56' elif b=='9':return '53' else:return 'error' elif a=='8': if b=='1':return '58' elif b=='2':return '73' elif b=='3':return '54' elif b=='4':return '91' elif b=='5':return '55' elif b=='6':return '19' elif b=='7':return '56' elif b=='8':return '37' elif b=='9':return '52' else:return 'error' elif a=='9': if b=='1':return '59' elif b=='2':return '58' elif b=='3':return '57' elif b=='4':return '56' elif b=='5':return '55' elif b=='6':return '54' elif b=='7':return '53' elif b=='8':return '52' elif b=='9':return '51' else:return 'error' else:return 'error'  


    最新回复(0)