Just time to list d2z, dec to Zeckendorf...
_8{.Fb NB. Reverse list of fibs...
34 21 13 8 5 3 2 1
d2z. NB. Dec to z
3 : 0
f =. Fb, 0
if. y = 0 do. ,0 return. end.
if. y e. f do. (#~>./\ ) Fb = y return.end.
reduce =. | }. +/\ inv f&(( (] - I.{[)^:a:)) n =. y NB. 12 ==> 12 4 1
}: (#~>./\ ) f e. reduce
)
More later,
Mike
Sent from my iPad
> On 19 Jul 2019, at 11:07, Mike Day <[email protected]> wrote:
>
> I did a quick compare - on the hoof, so briefly- my d2z and z2d, ie
> decimal-Zeckendorf switches appear faster than decode/encode - no time to say
> how or why!
>
> More later,
>
> Mike
>
> Sent from my iPad
>
>> On 19 Jul 2019, at 01:26, 'Jon Hough' via Programming
>> <[email protected]> wrote:
>>
>> The encoding follows the following algorithm:
>>
>> "To encode an integer N:
>>
>> Find the largest Fibonacci number equal to or less than N; subtract this
>> number from N, keeping track of the remainder.
>> If the number subtracted was the ith Fibonacci number F(i), put a 1 in place
>> i−2 in the code word (counting the left most digit as place 0).
>> Repeat the previous steps, substituting the remainder for N, until a
>> remainder of 0 is reached.
>> Place an additional 1 after the rightmost digit in the code word.
>> To decode a code word, remove the final "1", assign the remaining the values
>> 1,2,3,5,8,13... (the Fibonacci numbers) to the bits in the code word, and
>> sum the values of the "1" bits."
>> see: https://en.wikipedia.org/wiki/Fibonacci_coding
>>
>>
>> It might not be the most elegant or terse verb, but I think there is not
>> much complexity in it. You are right that there is no need to use char
>> sequence, could just use integer list, which may or may not be fast. I
>> really did that for debugging purposes, to easily read the representation
>> while encoding. On Friday, July 19, 2019, 1:13:18 AM GMT+9, Raul Miller
>> <[email protected]> wrote:
>>
>> I'm not quite sure I understand your encoding scheme.
>>
>> Specifically, you're encoding into a sequence of characters, but when
>> decoding, you're not using (8#2)#:a.i.y and it looks like you've
>> cooked up some mechanism to compensate for how |."1#: behaves ...
>>
>> In other words, I think that the fibonacci encoding aspect isn't the
>> problem here.
>>
>> So I think I would start with either a careful description of your
>> "encode to character" mechanism (how can I know if you've implemented
>> what you intended without that? I'd rather not try to reverse engineer
>> your thoughts and assumptions if that's not necessary) or I would
>> start with an implementation which isn't so complicated.
>>
>> Thanks,
>>
>> --
>> Raul
>>
>> On Thu, Jul 18, 2019 at 10:46 AM 'Jon Hough' via Programming
>> <[email protected]> wrote:
>>>
>>> Positive integers can be encoded using Fibonacci numbers.
>>> For the sake of easer, assume Fibonacci numbers are 1,2,3,5,... (only one
>>> 1).
>>> We can encode a positive integer uniquely using non-consecutive Fibonacci
>>> numbers. For example
>>>
>>> 4 = 1 + 3 (note: 1 and 3 a re non-consecutive)
>>> 5 = 5 (already a Fib number)
>>> 6 = 1 + 5
>>> 7 = 2 + 5
>>> 8 = 8
>>>
>>> These representation can be encoded using bits. 1's where a Fibonacci
>>> number is in the representation, 0s when not.
>>> 4 = 1 + 3 = 101
>>> 5 = 0001
>>> 6 = 1001
>>> 7 = 0101
>>> 8 = 00001
>>> ...
>>>
>>> We can append a 1 on the end of the encoding a a delimiter, so that during
>>> decoding we know easily where to stop. This way integers can be packed
>>> together.
>>>
>>> Here are some J verbs for encoding and decoding positive integers.
>>>
>>>
>>> NB. ===================================================================
>>> genfibs=: 3 : 0
>>> r=. 1 2
>>> i1=. 1
>>> i2=. 2
>>> c=. 2
>>> while. y > c=. c+1 do.
>>> t=. i1 + i2
>>> i1=. i2
>>> i2=. t
>>> r=. r, x: t
>>> end.
>>> )
>>>
>>>
>>> Fibs=: genfibs 1400
>>>
>>> encode=: 3 : 0
>>> d=. > (>@:,&:>)/ (<@encode1)"0 y
>>> r=. d,'0' #~ (#d) -~ 8 * >. 8 %~ # d
>>> pack r
>>> )
>>>
>>> encode1=: 3 : 0
>>> n=. x: y
>>> r=. ''
>>> k=: ''
>>> fl=. x: Fibs{~ I. Fibs <: y
>>> i=. <:#fl
>>> while. n do.
>>> r=. r,'1'
>>> n=. n- i{fl
>>> k=: k,i{fl
>>> i=. i-1
>>> while. (i >: 0) *. (n<i{fl) do.
>>> r=. r,'0'
>>> i=. i-1
>>> end.
>>> end.
>>> (|.r),'1'
>>> )
>>>
>>>
>>>
>>> pack=: 3 : 0
>>> a.{~ #. _8 ] \"."0 y
>>> )
>>>
>>> decode=: 3 : 0
>>> i=. , {:|."1 (8 # 2) ,:|."1 #: a.i. y
>>> n=. ''
>>> while. 1 e. 1 1 E. i do.
>>> idx=. {. I. 1 1 E. i
>>> n=. n, +/ Fibs {~ I. i {~ i. >: idx
>>> i=. (2+idx) }. i
>>> end.
>>> n
>>> )
>>>
>>> NB. ===================================================================
>>>
>>> The encode verb outputs the Fib-representation as bytes.
>>> encode 4
>>> �
>>>
>>> #: a.i. encode 4
>>> 1 0 1 1 0 0 0 0
>>>
>>>
>>> decode encode 449239438124834384923493383837734733747181x
>>> 449239438124834384923493383837734733747181
>>>
>>>
>>> decode encode 1 2 3 4 5 6 7
>>> 1 2 3 4 5 6 7
>>>
>>> Fibonacci encoding is not really a good compression encoding, but has some
>>> good error handling properties.
>>> I am not happy with the decode verb, as I wanted to write it without a
>>> while loop. Difficult though as there are some
>>> awkaward consecutive bits that might appear in the encoding, e.g.
>>> ...0 1 1 1 0...
>>> Using 1 1 E. with this breaks decoding unless done carefully. Easier just
>>> to use a while loop and eat the input every iteration.
>>>
>>> refs: https://en.wikipedia.org/wiki/Fibonacci_coding
>>> https://en.wikipedia.org/wiki/Zeckendorf%27s_theorem
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm