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
