### Arpa's blog

By Arpa, history, 6 years ago,

Hi!

One of the C++ programmers problems is to work with integers greater than 2^64-1 (we can save 0to 2^64-1 in unsigned long long int). So I want to share the best Bignum implementation I have ever seen (Link) with CodeForces Community.

Its specifications are as follows:

• Supported operations: + , -, / , * , % , ^(pow) , gcd , lcm , abs.

• It is able to work with Standard Input/Output streams.

• It can cast data to long long, string.

• It uses fast multiplication.

source.(but I have edited that and added pow and size().)

UPD1 (September 2016): Bug in void operator=(long long v) is now fixed. Thanks to amsen.

• +13

 » 6 years ago, # |   +8 Thank you, Arpa. Now I don't need to switch to Java.
 » 6 years ago, # |   +21 It would be fair to include the original LinkAlso what's lcp? :D
•  » » 6 years ago, # ^ | ← Rev. 4 →   -8 I have added size() and pow() functions to that library.
•  » » » 6 years ago, # ^ |   +17 This is called LCM though
•  » » » 6 years ago, # ^ | ← Rev. 2 →   +11 Added 17 most valuable lines of code and didn't even optimize if(b%2). OK.FYI:lcp = longest common prefixlcm = least common multiple
•  » » » » 6 years ago, # ^ |   +13 To be fair, b&1 is not faster than b%2. The compiler will produce the same machine code for both.
•  » » » » » 6 years ago, # ^ |   0 I meant different aspect of it. b is a bigint with base divisible by 2, so instead of using operator % one could simply write if (b.a[0] % 2) (at this point we know that vector isn't empty).
•  » » » 6 years ago, # ^ |   +54 You should at least mention the original author of the library.
•  » » » » 6 years ago, # ^ |   +13 Apparently, he doesn't have to. I agree that it would be good to do it, though. And maybe also make a pull-request to add those new size() and pow() functions to the original code.
 » 6 years ago, # |   -10 Thanks for this BigInt library. But I see Karatsiba multipluying in this library. Where is my Furje Multiply?And can u tell me pls about BigInteger Dividing, about algo of this
•  » » 6 years ago, # ^ |   +7 Fourier Multiply is o(N*log N), but the constant is fairly large so it's only worth for very very long numbers
 » 6 years ago, # |   +29 thanks for sharing!notice the following case bigint x = 0; x= -x; cout<< x <
 » 6 years ago, # | ← Rev. 2 →   -15 Unfortunately, there isn's standard library of Big Numbers in C++. And if you write important contest, that doesn't allow use extra materials (like your copybook or internet), this implementation won't help you. If only you memorize it, but you waste a lot of time writing this code.So, the best way still solve problems with big numbers on Java.
•  » » 6 years ago, # ^ |   0 the best way is save this code and paste it when you need
 » 4 years ago, # |   0 Arpa I can't find pow and size() in this bigint library.
•  » » 4 years ago, # ^ |   0 Link.
•  » » » 4 years ago, # ^ |   0 Thanks! another question. What does line 5 and line 6 do?
•  » » » » 4 years ago, # ^ |   0 This class keeps numbers in some big base (e.g. 109) to make operations faster.
 » 4 years ago, # |   0 Arpa How do I print the bigint number using printf()? I can print it using std::cout, but how to do it using printf()?
•  » » 4 years ago, # ^ |   0 Check how it's implemented to support istream and ostream (line 297 to line 311), you may know why it can't directly support printf.If for some reason, you need this library to output with printf, you can add a function to do that. e.g. add a function called print and let it print the number with printf.
 » 4 years ago, # |   +3 You implemented += via +. It is not optimal, doing the other way is much better. Consider the example: bigint large; // some large number for (int i = 0; i < 100000; ++i) { large += i; } Here large will be copied on each iteration, because += calls +. And if you implemented += inplace, this code would run in linear time. If you do it, + is implemented like friend bigint operator+(bigint lhs, const bigint& rhs) { return lhs += rhs; } 
 » 3 years ago, # |   +17 WRONG ANSWER on tests 21-40. Problem: https://www.e-olymp.com/ru/problems/317Input: 2 numbers A, B: 0 <= A, B <= 10^195000Output: A * B
•  » » 3 years ago, # ^ |   +8 I managed to fix his code. You can see my version here.I also did some optimization, including what ifsmirnov mentioned above.My version is not well tested yet, especially on negative numbers. Please let me know some problems on OJs which requires BigInt, so I can test it :D.
•  » » » 3 years ago, # ^ | ← Rev. 2 →   0 Thanks! I fixed it too, but my version without karatsuba multiply (only with fast fourier transform), without sqrt, comments in english, and sign of number. Now I want to study and write a quick division in time O (n log(n)) with Newton–Raphson division in base 10^9 (or another power of 10),
•  » » » 19 months ago, # ^ |   -8 Why did you use karatsuba multiplication? Is there any drawback of fft_mul?
 » 3 years ago, # |   +5 Dear good brother, I have a question. Do Iranian coders indent their code right aligned?
•  » » 3 years ago, # ^ |   0 No.
 » 9 months ago, # |   0 Is it possible to calculate 30! correctly?.... I failed to calculate 30! with unsigned long long int...
•  » » 9 months ago, # ^ |   0 Well, if you look up how big 30! is, and then compare it to the maximum value of unsigned long long, then you'll have your answer.
•  » » » 9 months ago, # ^ |   0 The author compare unsigned long long int to BigInteger(java),one of the reader of the post say that he dont have to learn java for BigInteger only.My curious mind wants to know,Is unsigned long long int is comparable with BigInteger of java?
•  » » » » 9 months ago, # ^ |   +5 I don't know much about Java, but my understanding is that Java has a builtin BigInteger implementation, while C++ does not.BigInt and unsigned long long aren't really the same. The purpose of BigInt is to hold arbitrarily large values, and do operations on them. Unsigned long long is a just primitive data type, like int or long long. Unsigned long long is the one that can hold the largest possible number. However it will still overflow once you get to a big enough number (in this case, 264).If you use BigInt, your calculations will be slower, but you can guarantee that you will never overflow. However I've never needed to use BigInt on Codeforces, so I don't think it's that common.
•  » » » » » 9 months ago, # ^ |   0 Thanks for your reply.It helps me a lot....
 » 9 months ago, # |   -34 Why should you put in the name of allah in a code ?for fuck sake...
•  » » 9 months ago, # ^ |   +2 I personally don't do that, but I don't see any problem with it. People have their beliefs, and you should respect them.
•  » » » 9 months ago, # ^ | ← Rev. 2 →   -37 Yeah, just like they slaughter humans in france.
•  » » » » 9 months ago, # ^ |   +3 The actions of a few do not define everybody in a group.
•  » » » » 9 months ago, # ^ |   -24 So you believe that 1.8 billion allah devotee are slaughters. You seriously need to get checked.
•  » » » » » 9 months ago, # ^ | ← Rev. 2 →   -16 yep, if they have the chance and power to do so, they will do it. They believe they should be the one in power to express sharia law, only this law can solve all humanity problems.sharia law explicitly call muslims to kill all unbelievers.You can't ask someone sane to respect such idea, the idea is the problem not the humans. Maybe you should get checked too.
•  » » » » » » 9 months ago, # ^ | ← Rev. 2 →   0 Dear keyboard warrior, before you say something in future, please provide the source and the context of that source. Anything out of context will surely sound irrational. If you do not know the source and context, do not talk.This is not the place. If you want to learn, you have internet. If you want to rant, you have other dedicated social networks.
•  » » » » » » » 9 months ago, # ^ | ← Rev. 2 →   -24 Dear keyboard terrorist, why don't you try to write an argument to correct my view. You can view the horrifying verses in my edit history.
•  » » » » » » » » 9 months ago, # ^ |   +7 Actually, they not. Everyone thinks like that because of some foolish people who think that killing people is commanded in Quran, but it was for the times that they were a war between Muslims and others, others were trying to kill Muslims where ever they see, Muslims weren't sure about killing them because their prophet didn't say anything about it and Quran says that human lives are important and be kind to unbelievers and teach them the ways of Quran. But the Quran said your lives are matter too, so you can kill them (for self-defense, in such case, it's not a crime for laws too). Also, other versicles have appeared in cases like that too, so please check the versicle's history and when they appeared before talking like that, it can be easily found on YouTube and other platforms by peoples who have searched and have more information about this. Also, there is no Sharia law to kill unbelievers, that's bullshit. (Another thing, not all Muslims live according to Sharia.)
•  » » » » » » » » » 9 months ago, # ^ |   -13 why don't you try teaching that to a group of terrorist ? I know, because they will also defend their view because it's equally valid.Your religion is strict but ambiguous, and there's no parser capable to read your holybook, that's why these kind of things happen.Your god is weak, because he can't even make your book unambiguous, so maybe you all should stop putting his name in a piece of code.
•  » » » » » » » » » 9 months ago, # ^ |   +5 I didn't say anything about my religion, or I didn't say anything about it's not ambiguous, I just said that you just writing things without searching, just with hearsay, so I wrote some information with proof that I know. And The thing about religions is everyone can have their own view, without that there will be no religion, there would be just some orders, commands, there wouldn't be any part of human will in this. (Also I don't write Allah in my codes, I think it's kinda weird too, but just because of that, you can't say something like all Muslims are murderers, they aren't like, "Hey bro, let's get out and kill some atheists, I need exp")
•  » » » » » » » » » 9 months ago, # ^ |   0 IMO there should be no religion in this world. That will be better for humanity, As religion make things worse.Note: Holy books are the example of people at the previous times wants to protect the humanity but in the modern era some people have found the loopholes.PS: If you wants to be creative do not follow any rules else you can be another, be free!