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