You should have used
   squares =: *: x: >: ? 1e5 $ 1e11

Computing the square using floating point and then converting to
extended precision means that many of your values in 'squares' are not
actually square.

For example:

   x: *: 68824904566
4736867488519007764480
   *: x: 68824904566
4736867488519007648356

That said, here's a working tacit implementation of what I think you
are looking for:

   intsq=: = [: *: <.@%:

This works for *: x: >: ? 1e5 $ 1e11 and detects that some numbers in
x: *: >: ? 1e5 $ 1e11 are not square.

I hope this helps,

-- 
Raul

On Wed, Apr 27, 2022 at 9:34 AM Ed Gottsman <edward.j.gotts...@gmail.com> wrote:
>
> Oops.  Foolish error as I prepared for presentation.  My apologies.
>
> Here’s the accurate implementation of intsqrt.
>
> intsqrt =: 3 : 0
> NB. y An array of possible integer squares
> NB. Return 0 for non-squares or integer roots
> s * y = x: *: s =. <. 0.5 + x: 10 ^ -: x: 10 ^. y
> )
>
> Note that it is explicit to the point of being obscene.  I’ll leave the tacit 
> implementation to someone more experienced than I.
>
> Thanks.
>
> Ed
>
> Sent from my iPad
>
> > On Apr 27, 2022, at 1:50 PM, Ed Gottsman <edward.j.gotts...@gmail.com> 
> > wrote:
> >
> > 
> > Project Euler #66, extended precision integer square roots, no spoilers
> >
> > Continuing the discussion, for which again thank you all: I found that what 
> > I really wanted was large *integer* square roots.  Since this seems to come 
> > up frequently in Project Euler problems and since I believe there are Euler 
> > participants on the mailing list, here’s an integer square root verb that 
> > uses the extended precision facilities and works on roots up to 1e11.  
> > (Note that %: does not participate in extended precision.)
> >
> > N.B.: I have not cracked #66 and nothing in this post should be construed 
> > as endorsing an approach to solving it.  This is just a J implementation of 
> > a utility verb.
> >
> > intsqrt =: 3 : 0
> > NB. y Possible squares of integers.  Return either integer
> > NB. square roots or 0s.
> >   +Multiply to produce either integer square roots or 0s
> >   |   +1s where the calculated square = the original square
> >   |   | +Force extended precision on *:
> >   |   | |  +Square the square roots
> >   |   | |  |  +Round the square roots to an integer
> >   |   | |  |  |        +Force extended precision on ^
> >   |   | |  |  |        |   +Calculate the square roots
> >   |   | |  |  |        |   |   +0.5(log(n)) = log(sqrt(n))
> >   |   | |  |  |        |   |   |  +Force extended precision on ^.
> >   |   | |  |  |        |   |   |  |     +Log base 10
> >   |   | |  |  |        |   |   |  |     |
> > y * y = x: *: <. 0.5 + x: 10 ^ -: x: 10 ^. Y
> > )
> >
> > (If J were written vertically, it might be easier to comment.)
> >
> >    NB. Testing the verb…
> >
> >    squares =: x: *: >: ? 1e5 $ 1e11  NB. 100000 integer squares <= 1e11 ^ 2
> >
> >    (+/ 0 < intsqrt squares)  NB. All of the numbers are integer squares
> > 100000
> >
> >    +/ 0 = intsqrt >: squares  NB. None of the numbers are integer squares
> > 100000
> >
> >    squares =: x: *: >: ? 1e5 $ 1e12  NB. Increase the roots to 1e12
> >
> >    +/ 0 < intsqrt squares  NB. Above 1e11, extended precision starts to fail
> > 77537
> >
> >    (6!:2) 'intsqrt squares'  NB. Fast, it is not.  (J901 on iPadOS)
> > 1.59675
> >    (6!:2) '%: squares'  NB. Fast but inaccurate for large squares
> > 0.013432
> >
> > Ed
> >
> > P.S. Devon, I’ll be there.  Thanks.
> >
> > Sent from my iPad
> >
> >>> On Apr 22, 2022, at 6:11 AM, Devon McCormick <devon...@gmail.com> wrote:
> >>>
> >> Hi Ed,
> >> I was thinking of explaining Roger's sqrt code as part of next month's
> >> NYCJUG.
> >> You should take a look:
> >> https://www.meetup.com/J-Dynamic-Functional-Programming/ .
> >> Cheers,
> >> Devon
> >>
> >> On Fri, Apr 22, 2022 at 12:49 AM Ed Gottsman <edward.j.gotts...@gmail.com>
> >> wrote:
> >>
> >>> Thanks to everyone who responded and in particular for the link to Roger
> >>> Hui’s essay.  The wiki discussion was also very good.
> >>>
> >>> (In an earlier life I disparaged “cargo cult” programming, in which you
> >>> take a few lines of source you don’t understand and integrate them into
> >>> your program.  [That you effectively do the same thing when you adopt
> >>> someone else’s compiled library cut no ice with me.]  J has forced me to
> >>> relax a bit in that regard and I will probably adopt some of Roger’s code
> >>> without entirely understanding it. :-) )
> >>>
> >>> Thanks again.
> >>>
> >>> Ed
> >>>
> >>> Sent from my iPad
> >>>
> >>>>> On Apr 21, 2022, at 8:18 PM, Gilles Kirouac <g1...@myriade.ca> wrote:
> >>>>
> >>>> Ed If you expand the Extended Integers section (below by bob), you will
> >>> see a link to an essay by Roger on 'Extended Precision Functions'. There 
> >>> is
> >>> a Square Root verb.
> >>>>
> >>>>  NB. long rational result may exceed line length
> >>>>  sqrt 1x + *:  999999999x
> >>>>
> >>> 1249999998750000000625000000625000000468750000156249999765624999453r1250000000000000000000000000000000000000000000000000000000
> >>>>  sqrt  *:  999999999x
> >>>> 999999999
> >>>>
> >>>>
> >>>> ~ Gilles
> >>>>
> >>>>> Le 2022-04-21 à 14:50, 'robert therriault' via Programming a écrit :
> >>>>> Gilles,
> >>>>> In Nuvoc the extended constant notation can be found here
> >>> https://code.jsoftware.com/wiki/Vocabulary/Constants#Extended_Integers
> >>>>> Having said that, it is hidden pretty well and most of its references
> >>> are previous documentation on the jsoftware site. There is certainly work
> >>> to be done on the wiki!
> >>>>> Cheers, bob
> >>>>>>> On Apr 21, 2022, at 11:44, Gilles Kirouac <g1...@myriade.ca> wrote:
> >>>>>>
> >>>>>> Ed
> >>>>>>
> >>>>>> You seem unaware of the extended precision constant notation:
> >>>>>>
> >>>>>> "digits with a trailing x denote an extended precision integer"
> >>>>>>
> >>>>>> https://www.jsoftware.com/help/dictionary/dcons.htm
> >>>>>> [Where is the equivalent in NuVoc?]
> >>>>>>
> >>>>>> I would rather write
> >>>>>>
> >>>>>>  1x + *:  999999999x
> >>>>>> 999999998000000002
> >>>>>>
> >>>>>> ~ Gilles
> >>>>>>
> >>>>>> Le 2022-04-21 à 12:51, Henry Rich a écrit :
> >>>>>>>   3!:0 %: x: 1 + x: *: x: 999999999
> >>>>>>> 8
> >>>>>>> The square root cannot be represented exactly.
> >>>>>>> Henry Rich
> >>>>>>> On 4/21/2022 12:43 PM, Ed Gottsman wrote:
> >>>>>>>> Hello.
> >>>>>>>> I’m working on the Project Euler “Diophantine equation” problem
> >>> (#66) and using J’s extended precision facilities.  I’ve run into behavior
> >>> that confuses me.  Boiled down (and overusing x: just to be sure):
> >>>>>>>>    x: %: x: 1 + x: *: x: 999999999
> >>>>>>>> 999999999
> >>>>>>>> That is (if my syntax is right), the square root of (one plus the
> >>> square of a really large n) is n.  I’m apparently misunderstanding
> >>> something about extended precision.  I’ve tried it with a variety of uses
> >>> of x: but to no avail, and as I read the x: documentation…this is an odd
> >>> result.
> >>>>>>>>
> >>>>>>>> Any help would be much appreciated.
> >>>>>>>> (J901 on iPadOS, for which sincere kudos to Ian Clark.)
> >>>>>>>> Many thanks.
> >>>>>>>> Ed
> >>>>>>>>
> >>> ----------------------------------------------------------------------
> >>>>>>>> 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
> >>> ----------------------------------------------------------------------
> >>> For information about J forums see http://www.jsoftware.com/forums.htm
> >>>
> >>
> >>
> >> --
> >>
> >> Devon McCormick, CFA
> >>
> >> Quantitative Consultant
> >> ----------------------------------------------------------------------
> >> 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

Reply via email to