# Get first 40 digits of a BigInteger

• 12-13-2011, 09:51 PM
sgtlaugh
Get first 40 digits of a BigInteger
Hi, I need to write a program for which I need to get the first 40 digits of many BigInteger numbers, say about 100000:(snooze): So, I can generate all these numbers in less than 2 seconds, but how do I get
the first 40 digits of all the numbers? I tried using toString(), it works but it is very very slow. I need something faster please help!
• 12-13-2011, 10:06 PM
Norm
Re: Get first 40 digits of a BigInteger
Which are the first 40? From the left or from the right end of the number?
Can you post a SSCCE that compiles and demonstrates your problem?
• 12-13-2011, 10:10 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
The first 40 digits. Actually I need to get the first 40 digits of the first 100000 Fibonacci numbers. Sorry, but how to write a
SSCCE? I am actually new here, sorry for my lack of knowledge :(
• 12-13-2011, 10:14 PM
Norm
Re: Get first 40 digits of a BigInteger
Google gives this: Short, Self Contained, Correct Example

To work on the problem we need code.

How many Fibonacci numbers do you need before you get one that has 40 digits?
• 12-13-2011, 10:19 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
Code:

```import java.io.*; import java.util.*; import java.math.BigInteger; public class Main {         public static void main(String[] args){                 BigInteger temp = BigInteger.valueOf(1);                 BigInteger temp2 = BigInteger.valueOf(2);                 BigInteger []ar;                 ar = new BigInteger[100010];                 ar[0] = temp;                 ar[1] = temp2;                 for (int i = 2; i <= 100005; i++){                         BigInteger res = temp.add(temp2);                         BigInteger temp3 = temp2;                         temp2 = res;                         temp = temp3;                         String str = res.toString(); // This is the line which slows done the whole code in my opinion.                 }         } }```
Here's a part of my code, any help would be appreciated. Thanks a lot :)
• 12-13-2011, 10:24 PM
Norm
Re: Get first 40 digits of a BigInteger
What is the purpose of creating the String: str if you never use it?

If you remove the last statement in the loop, it will run faster.
• 12-13-2011, 10:26 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
My plan was to get the first 40 digits of the numbers using str.substring(0, 40); But just the conversion to a string takes a whole lot of time so I omitted the latter part. How can I achieve this more efficiently?
• 12-13-2011, 10:27 PM
2by4
Re: Get first 40 digits of a BigInteger
Why have you got a huge array with only two values populated?
• 12-13-2011, 10:28 PM
Norm
Re: Get first 40 digits of a BigInteger
You need to post the code you are having the problem with.

The code you posted does not use the String str so it makes no sense to have it in the code.
• 12-13-2011, 10:30 PM
Norm
Re: Get first 40 digits of a BigInteger
The array isn't used in the loop either. It looks completely redundant.
• 12-13-2011, 10:34 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
Ok here goes my whole code.

Code:

```import java.io.*; import java.util.*; import java.math.BigInteger; public class Main {         public static void main(String[] args){                 BigInteger temp = BigInteger.valueOf(1);                 BigInteger temp2 = BigInteger.valueOf(2);                 BigInteger []ar;                 ar = new BigInteger[100010];                 ar[0] = temp;                 ar[1] = temp2;                 for (int i = 2; i <= 100005; i++){                         BigInteger res = temp.add(temp2);                         BigInteger temp3 = temp2;                         temp2 = res;                         temp = temp3;                         String str = res.toString(); // This is the line which slows done the whole code in my opinion.                         int len = str.length();                         int flag;                         if (len < 40) flag = len;                         else flag = 40;                         String substring = str.substring(0, flag);                         BigInteger ans = new BigInteger(substring);                         ar[i] = ans;                         //System.out.println(ans);                 }         } }```
• 12-13-2011, 10:41 PM
Norm
Re: Get first 40 digits of a BigInteger
Can you detect if the value of a BigInteger has > 40 decimal digits and use division to remove the low order digits you don't want.
• 12-13-2011, 10:43 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
Yes I tried division, it is slow like toString() because I have to perform it about 100,000 times :o:
• 12-13-2011, 10:48 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
I also tried using BigInteger.shiftRight(int bits) to trim result, but I don't know how to achieve this. It would have been much faster but I don't know if it's possible
• 12-13-2011, 10:51 PM
Norm
Re: Get first 40 digits of a BigInteger
You can't shift binary bits an even number of decimal digits.
• 12-13-2011, 10:58 PM
Norm
Re: Get first 40 digits of a BigInteger
Can you post the code you used with the division?
• 12-13-2011, 11:00 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
Okay but how to solve my problem now? Any suggestions?
• 12-13-2011, 11:00 PM
Norm
Re: Get first 40 digits of a BigInteger
That's what I'm working on.
• 12-13-2011, 11:06 PM
sgtlaugh
Re: Get first 40 digits of a BigInteger
Sorry, I closed the division program and later reopened it and modified it to create this string program. I can of course re-write it but I must go now. I'll check here later, please post a solution if you find any. Thanks a lot for your time and help, bye for now.
• 12-13-2011, 11:10 PM
Norm
Re: Get first 40 digits of a BigInteger
I'll wait for your post of the division code