Go Back   Rhinocerus > Newsgroup > Newsgroup comp.lang.java.* > Newsgroup comp.lang.java.programmer

Reply
 
Thread Tools Display Modes
  #1 (permalink)  
Old 06-08-2012, 07:03 PM
Jan Burse
Guest
 
Posts: n/a
Default Quick n-th Square of BigInteger

Dear All,

What is your favorite algorithm to compute the n-th Square of
a BigInteger, i.e.

Given: x, n
Compute: y = max { z | z^n =< x }

Bye
Reply With Quote
Alt Today
Advertising
 
and become member of Rhinocerus
Standard Sponsored Links

  #2 (permalink)  
Old 06-08-2012, 08:34 PM
Gene Wirchenko
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

On Fri, 08 Jun 2012 21:03:56 +0200, Jan Burse <janburse@fastmail.fm>
wrote:

>Dear All,
>
>What is your favorite algorithm to compute the n-th Square of
>a BigInteger, i.e.
>
> Given: x, n
> Compute: y = max { z | z^n =< x }


Do you mean the integer part of the nth *root* of z given integer
x and n?

I do not have a favourite or even an algorithm. If I had to come
up with something, I would probably try a first approximation with
logarithms.

Sincerely,

Gene Wirchenko
Reply With Quote
  #3 (permalink)  
Old 06-08-2012, 08:36 PM
Jan Burse
Guest
 
Posts: n/a
Default Quick n-th Root of BigInteger

Gene Wirchenko schrieb:
> On Fri, 08 Jun 2012 21:03:56 +0200, Jan Burse <janburse@fastmail.fm>
> wrote:
>
>> Dear All,
>>
>> What is your favorite algorithm to compute the n-th Square of
>> a BigInteger, i.e.
>>
>> Given: x, n
>> Compute: y = max { z | z^n =< x }

>
> Do you mean the integer part of the nth *root* of z given integer
> x and n?
>
> I do not have a favourite or even an algorithm. If I had to come
> up with something, I would probably try a first approximation with
> logarithms.
>
> Sincerely,
>
> Gene Wirchenko
>


Sorry, yes root, and z integer.
Reply With Quote
  #4 (permalink)  
Old 06-08-2012, 08:55 PM
markspace
Guest
 
Posts: n/a
Default Re: Quick n-th Root of BigInteger

On 6/8/2012 1:36 PM, Jan Burse wrote:
> Gene Wirchenko schrieb:
>> On Fri, 08 Jun 2012 21:03:56 +0200, Jan Burse <janburse@fastmail.fm>
>> wrote:
>>
>>> Dear All,
>>>
>>> What is your favorite algorithm to compute the n-th Square of
>>> a BigInteger, i.e.
>>>
>>> Given: x, n
>>> Compute: y = max { z | z^n =< x }

>>
>> Do you mean the integer part of the nth *root* of z given integer
>> x and n?


> Sorry, yes root, and z integer.



Positive integers? Do you want the complex roots too? ;-) You ask big
questions Jan, but I think you need to ask them a little more thoughtfully.

I'm confused about the max, the z |, and the =< x. Care to explain
what those signify in your question? If you want something besides the
real, positive nth root of A=z^n, what do you want? I think "nth root
of A" is the correct phrasing, which leads to the wonder what the other
mathematical verbiage signifies.

Reply With Quote
  #5 (permalink)  
Old 06-08-2012, 09:00 PM
Jan Burse
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

Jan Burse schrieb:
> Dear All,
>
> What is your favorite algorithm to compute the n-th Square of
> a BigInteger, i.e.
>
> Given: x, n
> Compute: y = max { z | z^n =< x }
>
> Bye


Clarification:

Given: x BigInteger positive non-zero, n int positive non-zero

Compute: y BigInteger = max { z BigInteger | z^n =< x }

(In words: y is the biggest BigInteger z such that
z raised to the power of n is less or equal x)

(Mathematically this is would be floor(root(x,n)))

Bye
Reply With Quote
  #6 (permalink)  
Old 06-08-2012, 09:04 PM
Eric Sosman
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

On 6/8/2012 3:03 PM, Jan Burse wrote:
> Dear All,
>
> What is your favorite algorithm to compute the n-th Square of
> a BigInteger, i.e.
>
> Given: x, n
> Compute: y = max { z | z^n =< x }


(I'm assuming you mean n'th root, which is what your final
line seems to imply.)

It's not something I've found a need to do, so I have no
"favorite" algorithm. For positive `x' I think I'd start
by observing that

x.bitCount()-1 <= lg(x) < x.bitCount()

hence the lg() of the desired root is between

floor((x.bitCount()-1)/n) <= lg(root) < ceil(x.bitCount()/n)

From this you can get lower and upper bounds on the root itself,
something like (just typed in free-hand)

BigInteger lo = BigInteger.ONE.shiftLeft(
Math.floor((x.bitCount()-1)/n));
BitInteger hi = BigInteger.ONE.shiftLeft(
Math.ceil(x.bitCount()/n));

.... and then do a binary search between those extrema. (Looks like
they'd differ by a factor of two usually, maybe a factor of four
occasionally -- but I might be wrong about that.)

Simplifications might be possible if `n' is known to be an
integer.

For negative `x' and odd integer `n' you could find the bounds
for -x, negate and interchange them, and then do the same binary
search.

For negative `x' and `n' even or non-integer, I think you're
out of luck.

--
Eric Sosman
esosman@ieee-dot-org.invalid
Reply With Quote
  #7 (permalink)  
Old 06-08-2012, 09:06 PM
glen herrmannsfeldt
Guest
 
Posts: n/a
Default Re: Quick n-th Root of BigInteger

markspace <-@.> wrote:
(snip)
>>> On Fri, 08 Jun 2012 21:03:56 +0200, Jan Burse <janburse@fastmail.fm>


>>>> What is your favorite algorithm to compute the n-th Square of
>>>> a BigInteger, i.e.


>>>> Given: x, n
>>>> Compute: y = max { z | z^n =< x }


(snip)
>> Sorry, yes root, and z integer.


> Positive integers? Do you want the complex roots too? ;-)
> You ask big questions Jan, but I think you need to ask them
> a little more thoughtfully.


I will guess that the OP isn't a native English speaker, and
is not translating so well.

I had to look it up as I didn't know, .fm seems to be Micronesia.

It looks like he wants the nth root rounded down to the next
integer value.

I do remember when first learning Fortran wondering why no
ISQRT function.

One possibility is to do exactly as written, binary search
for the largest z such that z**n <= x. (No exclusive or operators
are needed here.)

-- glen
Reply With Quote
  #8 (permalink)  
Old 06-08-2012, 09:19 PM
Jan Burse
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

Eric Sosman schrieb:
> ... and then do a binary search between those extrema. (Looks like
> they'd differ by a factor of two usually, maybe a factor of four
> occasionally -- but I might be wrong about that.)


Binary search would use (x.bitCount()-1)/n steps in the
extrem, and in each step calculating pow(). Is this
effective?

Reply With Quote
  #9 (permalink)  
Old 06-08-2012, 09:21 PM
Jan Burse
Guest
 
Posts: n/a
Default Re: Quick n-th Root of BigInteger

glen herrmannsfeldt schrieb:
> I will guess that the OP isn't a native English speaker, and
> is not translating so well. I had to look it up as I didn't know,
> .fm seems to be Micronesia.


Ha Ha

fastmail.fm = messagingengine.com

Reply With Quote
  #10 (permalink)  
Old 06-08-2012, 09:34 PM
Jan Burse
Guest
 
Posts: n/a
Default Re: Quick n-th Root of BigInteger

markspace schrieb:
> I'm confused about the max, the z |, and the =< x.


For those who don't know, there exists a set builder notation:

http://en.wikipedia.org/wiki/Set-bui...ion#Z_notation

max is then a higher order function from a set to an element.

Forgot where this is taught, in elementary school?

Bye
Reply With Quote
  #11 (permalink)  
Old 06-08-2012, 09:40 PM
Eric Sosman
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

On 6/8/2012 5:19 PM, Jan Burse wrote:
> Eric Sosman schrieb:
>> ... and then do a binary search between those extrema. (Looks like
>> they'd differ by a factor of two usually, maybe a factor of four
>> occasionally -- but I might be wrong about that.)

>
> Binary search would use (x.bitCount()-1)/n steps in the
> extrem, and in each step calculating pow(). Is this
> effective?


In light of your abusiveness in responding to other people who've
tried to help, I decline to assist you any further. Have a nice life.

--
Eric Sosman
esosman@ieee-dot-org.invalid
Reply With Quote
  #12 (permalink)  
Old 06-08-2012, 09:43 PM
Jan Burse
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

Eric Sosman schrieb:
> In light of your abusiveness in responding to other people who've
> tried to help, I decline to assist you any further. Have a nice life.


Problem is I scribbled the exact same solution on
a back of an envelope, but I have doubt that it is
a good solution for small n, like n=2.

Bye

Reply With Quote
  #13 (permalink)  
Old 06-08-2012, 09:43 PM
Lew
Guest
 
Posts: n/a
Default Re: Quick n-th Root of BigInteger

On Friday, June 8, 2012 2:34:40 PM UTC-7, Jan Burse wrote:
> markspace schrieb:
> > I'm confused about the max, the z |, and the =< x.

>
> For those who don't know, there exists a set builder notation:
>
> http://en.wikipedia.org/wiki/Set-bui...ion#Z_notation
>
> max is then a higher order function from a set to an element.
>
> Forgot where this is taught, in elementary school?


Riiiight. As nations and smaller school districts remove evolution from
their textbooks, they're going to teach mathematical logic and set
theory in elementary school?

In any event, this being a Java forum, the notation '=<' (shown nowhere
in your reference link, BTW) is rather odd, as we are used to '<='. Given
that '=<' apparently is not part of the "Set Builder" notation, how about
we stick with the Java (also C, Fortran, C++, C#, Javascript, BASIC, SQL,
Python, shell, ...) idiom?

--
Lew
Reply With Quote
  #14 (permalink)  
Old 06-08-2012, 09:47 PM
Jan Burse
Guest
 
Posts: n/a
Default Re: Quick n-th Root of BigInteger

Jan Burse schrieb:
> Do you want me to start counting the trolls that will
> now make their appearance in this thread? You are
> number 3 so far. I guess there will follow some more...


But still comp.lang.java.programmer is too small
I guess so that a shitstorm will rise. And there are
still some that want to profit.

Bye

Reply With Quote
  #15 (permalink)  
Old 06-08-2012, 09:52 PM
Lew
Guest
 
Posts: n/a
Default Re: Quick n-th Square of BigInteger

On Friday, June 8, 2012 2:43:37 PM UTC-7, Jan Burse wrote:
> Eric Sosman schrieb:
> > In light of your abusiveness in responding to other people who've
> > tried to help, I decline to assist you any further. Have a nice life.

>
> Problem is I scribbled the exact same solution on
> a back of an envelope, but I have doubt that it is
> a good solution for small n, like n=2.


For n == 2, just use any of the standard algorithms for square root, like
<http://stackoverflow.com/questions/3432412/calculate-square-root-of-a-biginteger-system-numerics-biginteger?rq=1>
found in about 10 minutes of online searching.

--
Lew
Reply With Quote
 
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off




All times are GMT. The time now is 04:29 AM.


Copyright ©2009

LinkBacks Enabled by vBSEO 3.3.0 RC2 © 2009, Crawlability, Inc.