When you apply %: to an extended precision number which is not a perfect
square, the result is a 64-bit floating point number.  For your task you
want to stay in the exact domain. <.@%: does that.  <.@%:y is different
from <.%:y.  The latter is the same as <.(%:y), i.e. has a non-high
precision result.

See section II.G of the dictionary,
https://www.jsoftware.com/help/dictionary/dictg.htm




On Sun, May 17, 2020 at 6:08 PM Skip Cave <[email protected]> wrote:

> Roger,
>
> I don't understand your last post.  I'm trying to find a way to search for
> perfect squares.
>
> For smaller integers the plan is easy.
> 1. Generate a list of integers (eg. 1 to 30):
>    ]n=.>:i.30
>
> 2. Take the square root of each one (%:)
>     %:n
>
> 1 1.4142 1.7321 2 2.2361 2.4495 2.6458 2.8284 3 3.1623 3.3166 3.4641 3.6056
> 3.7417 3.873 4 4.1231 4.2426 4.3589 4.4721 4.5826 4.6904 4.7958 4.899 5
> 5.099 5.1962 5.2915 5.3852 5.4772
>
>
> 3. Find and mark the square roots of n that are integers (=>.)
>
> (=>.)%:n
>
> 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0
>
>
> 4. Use the marks to select the integers in n that are perfect squares
> (n#~):
>
> n#~(=>.)%:n
>
> 1 4 9 16 25
>
>
> So we are able to find the perfect squares in the range 1 to 30.
>
>
> Now I want to find the perfect squares in the range of factorial 1 to 30:
>
> Actually I know that factorials of integers *can't* have square roots
> (except !1), but I want to check. See https://bit.ly/3fXevkr
>
>
> So we generate the factorials of the integers 1 to 30 and store them in n:
>
> ]n=.!>:i.30x
>
> 1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600 6227020800
> 87178291200 1307674368000 20922789888000 355687428096000 6402373705728000
> 121645100408832000 2432902008176640000 51090942171709440000
> 1124000727777607680000 25852016738884976640000 620448401733239439360000
> 15511210043330985984000000 403291461126605635584000000
> 10888869450418352160768000000 304888344611713860501504000000
> 8841761993739701954543616000000 265252859812191058636308480000000
>
>
> Now take the square roots of those 30 factorials, then find & mark any of
> the square roots that are integers. We know that only the first square root
> (%:!1) should be an integer, since 1 is a perfect square. all the square
> roots of the other factorials should not be integers, as they are not
> perfect squares.
>
>
> (=>.)%:n
>
> 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
>
> Uh oh! J is telling me that factorials of the last 5 integers (n=.26 27 28
> 29 30) are perfect squares! This is clearly not true. Roger showed this in
> his response to me, but he didn't propose a solution.
>
>
> How can I take the square root of large integers such as !26 27 28 29 30 in
> J, and get an accurate floating point or rational number?
>
>
> Skip Cave
>
>
>
> On Sun, May 17, 2020 at 4:18 PM Roger Hui <[email protected]>
> wrote:
>
> > Use <.@%:
> >
> >    s=: <.@%: !26x
> >    s
> > 20082117944245
> >    s*s
> > 403291461126567024928620025
> >    !26x
> > 403291461126605635584000000
> >
> >
> > On Sun, May 17, 2020 at 2:00 PM Skip Cave <[email protected]>
> wrote:
> >
> > > We can find perfect squares in a list by taking the square root (%:)
> of a
> > > number, and checking to see if it is an integer:
> > >
> > > * n#~(=>.)%:n=.>:i.30*
> > >
> > > *1 4 9 16 25*
> > >
> > >
> > > Now we can try larger integers by taking the square root of the
> factorial
> > > of some small integers:
> > >
> > > * n#~(=>.)%:!n=.>:i.30*
> > >
> > > *1 26 27 28 29 30*
> > >
> > >
> > > Hmm. This says that !26 and up, are perfect squares.
> > >
> > > * !26x*
> > >
> > > *403291461126605635584000000*
> > >
> > > * %:!26x*
> > >
> > > *20082117944246*
> > >
> > >
> > > Well it looks like %:!26x is an integer, making !26x a perfect square.
> > > Let's check:
> > >
> > > * 20082117944246x^2*
> > >
> > > *403291461126607189164508516*
> > >
> > > * !26x*
> > >
> > > *403291461126605635584000000*
> > >
> > >
> > >  *  (!26x)-:20082117944246x^2 *
> > > *0*
> > > Clearly, !26x is not a perfect square.
> > >
> > > Looks like J has precision issues with the square root of large
> extended
> > > integers. How can I fix this, to find accurate square roots of large
> > > integers?
> > >
> > > Skip Cave
> > > ----------------------------------------------------------------------
> > > 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

Reply via email to