Minkowski question-mark function: Difference between revisions

Content added Content deleted
m (J: remove some silliness, add a small but movtivating example)
(J: trivia)
Line 474: Line 474:
f=. 1|y
f=. 1|y
node=. *i.2 2 NB. node of Stern-Brocot tree
node=. *i.2 2 NB. node of Stern-Brocot tree
B=.''
B=. ''
for.i.ITERCOUNT do.
for. i.ITERCOUNT do.
B=.B, b=. f>:%/t=. +/node
B=. B, b=. f>:%/t=. +/node
node=. t (1-b)} node
node=. t (1-b)} node
end.
end.
Line 486: Line 486:
cf=. i.0
cf=. i.0
cur=. 0 NB. 1 if generating "top" side of cf
cur=. 0 NB. 1 if generating "top" side of cf
cnt=. 1 NB. bits
cnt=. 1 NB. "bits" (proposed continued fraction element)
for.i.ITERCOUNT do.
for. i.ITERCOUNT do.
if. f=<. f do.
if. f=<. f do.
cf=. cf,%cnt break.
cf=. cf,%cnt break.
Line 500: Line 500:
(+%)/(<.y),cf
(+%)/(<.y),cf
}}</lang>
}}</lang>

Task examples:

<lang J> minkowski 0.5*1+%:5
1.66667
((%:13)-7)%6
_0.565741
invmink _5%9
_0.565741
(p:%%:)2
3.53553
invmink minkowski (p:%%:)2
3.53553
minkowski invmink (p:%%:)2
3.53553
*:invmink 1.4 NB. square of inverse minkowski of 1.4
2</lang>


That said, note that this algorithm introduces significant numeric instability for √7 divided by 3:
That said, note that this algorithm introduces significant numeric instability for √7 divided by 3: