[링크]직접만든 프로그램으로 2의 1000000000 (10억)승 계산한게 자랑

지리즈의 이미지

http://gall.dcinside.com/list.php?id=hit&no=10262&page=1&bbs=

역시 디씨이네요.

결과물의 자리수가 대략 3억 자리가 넘고 텍스트 파일로 293M 라고...

저는 이글 올리는 순간 3억자리가 넘는 숫가 몇바이트인가 계산해본 것이 전부.

alfalf의 이미지

이 글을 본 나는 Python에서 2 ** 1000000000을 했을 뿐이고. 그 결과를 기다릴 뿐이고. 하하..

* 수정 *
게시판에 글 올리는 사이에 결과가 나왔을 뿐이고. 하하..

kasworld의 이미지

저도 저글 보자 마자 똑같은 계산을 시키고 있었습니다. ㅎㅎ;;;

그런데 생각보다 오래 걸려서 분석해 봤더니
계산 하는것( n = 2** 1000000000) 보다
인쇄하는 데 시간을 더걸리고
그것도
n을 10진 문자열로 변환하는데 가장 오랜시간이 걸리더군요. ;;;
그리고 100억을 계산 하려 했더니 메모리가 20G 넘게 필요해서 관뒀습니다. ^^

hexagon의 이미지

나름 제가 필요한 수준(실험데이터or유한요소해석데이터에서 수치 추출 및 연산 이라던가 수치 미분 적분 등 간단한 수준만...ㅎㅎ)에선 프로그래밍 좀 아는데...
이게 그냥 2^(10억)하면되나요?

c언어 배울때 가장 길이가 긴 정수형 변수도 200메가나 되는 수치를 담는다는 말은 못들어본거 같은데...
언어마다 변수 특징이 다르니 정확히 파이썬으로 해보고싶지만, 파이썬 설치하기가 귀찮아서..-_-

포트란으로 한번 해봐야겠네요..ㅎㅎ

JuEUS-U의 이미지

프갤을 여기서 볼줄이야 - ㅅ-)...

그나저나 사람들이 정말 신기한게,
BigInt를 왜 못짜는거죠...?
char로 10진수 하는건 또 잘하면서 int로 2^32진수로 하는건 못하더라구요...

hexagon의 이미지

char로 10진수 다루는 건 보통인가 보네요...
전 프로그래밍은 딱 필요한 만큼만 필요할때 공부해서 쓰는지라 영 깜깜하네요...

포트란으로도 못하겠어요~ㅎㅎ 이것도 사실 배운지 얼마 안됀거라...-_-
차라리 씨언어나 매트랩이 더 익숙하긴한데...왠지 2^10억은 안될거 같아서리..

JuEUS-U의 이미지

십진수로 하는거는 손으로 하는 곱셈을 분석해서 짜면 됩니다.
프로그래밍이 다른 수학하고 살짝 다른게,
추상화된 작업을 특정 수준까지 깨고 내려가는거죠 ㅡ,ㅡ)

kaeri17의 이미지

저도 BigInt 만드려고 몇번 했는데 int형 array로 2진수로 나타내고 곱하고 더하기 알고리즘좀 좋은거 찾으려니 도저히 못해먹겠더라고요.. 그냥 GMP 썼음...

kaeri17의 이미지

그냥 2진수로 1이 맨 앞에 있고 0이 10억 - 1개 붙어있는것 아닌가...

JuEUS-U의 이미지

적당히 계산할 거리가 없어서 그런거 아닐까요 ㅎㅎ

원래 백만팩 천만팩 돌리고 놀았는데,
팩토리얼 특성상 숫자가 급격하게 커져버리니....
저 숫자가 적당히 크고 임팩트가 있죠 'ㅅ')

cleansugar의 이미지

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

익명 사용자의 이미지

역시나..
예지력이 상승했군요.. 이글 나올줄 알았습니다 :D

alice79의 이미지

처음에 수작업으로 2진수 200, 300자리 정도 계산한 게 두 명 정도 힛갤 갔고

그걸 보고 프겔의 글쓴이가 원래 팩토리얼 구하는 프로그램을 2진수 구하는 프로그램으로 수정해서 만든거라 그럴겁니다.

cleansugar의 이미지

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

feanor의 이미지

10억승은 좀 어렵고 (충분히 빠르게 안나오네요) 10만승은 간단히 짜봤습니다.
https://gist.github.com/926042

cleansugar의 이미지

KLDP에서 더 많이 세면 디씨를 이겼다고 광고 될 것 같은데요. ㅋㅋㅋㅋ

2의 10억승의 10억승 정도 계산하면 될 듯.

이거 API 괜찮군요.
http://www.apfloat.org/apfloat_java/

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

snowall의 이미지

10억의 10억제곱이면 300MB*300MB ~ 100EB = 90000TB정도 됩니다. 이걸 저장하려면 하드디스크 값만 억대가 넘어가죠...

해낸다면, 여러모로 폐인소리 들을 듯...-_-

http://www.zdnet.co.kr/news/news_view.asp?artice_id=20110211172659

인간이 지금까지 만든 정보량이 300EB정도 되니까, 어마어마한 양입니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

cleansugar의 이미지

그렇군요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

jeongheumjo의 이미지

DNA의 정보량이 인류가 만든 데이터량 295EB 의 100배정도라면,
저장장치를 DNA로 만들수는 없을까요?
DNA RAM
후후

ipes4579의 이미지

좋은 코드입니다. 잘 보고 갑니다.

cleansugar의 이미지

컴퓨팅 파워 남는 분들 이거 계산하시면 좋습니다.

비트코인
http://ko.wikipedia.org/wiki/%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

cleansugar의 이미지

웃긴 댓글:

ㅋ 병신들아 48/2(9+3) 계산하는 프로그램이나 만들어라

김유식 요즘 디시가 너무 어려워졌어요. ㅠ.ㅠ

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

winner의 이미지

저도 Python으로 계산만 해볼려고 했는데 시간이 꽤 걸려서 포기했습니다. 이런 거 다중 core 사용하면서 가장 쉽게 지원하는 언어구현이 뭘까요?

JuEUS-U의 이미지

메트랩(학교서버)하고 Mathematica(놋북)에서 시도해봤는데
안나옵니다 - ㅅ-)ㅋㅋㅋ
범용으로는 못구해요.

cleansugar의 이미지

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

cleansugar의 이미지

http://en.wikipedia.org/wiki/Largest_known_prime

NHK 다큐-리만가설, 천재들의 150년의 도전 재밌네요
http://kldp.org/node/120508

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

swirlpotato의 이미지

저걸 만든 인간이 친구인데 심심 풀이로 팩토리얼 고속 계산을 해보자는 이유로 여러 알고리즘과 OPENMP를 써서 한적이 있습니다. 그 때 만들어진 라이브러리로 2의n승은 대충 만들어서 올린 것 같네요.

kippler의 이미지

간단할줄 알고 그냥 대충 만들어 봤는데 생각만큼 쉽지 않네요.

http://www.indidev.net/forum/viewtopic.php?p=219

저처럼 한가하신 분들은 한번씩 손으로 직접 코딩해 보세요.

ps) 아 쓰고 보니 위에 비슷한 소스가 이미 있네요.

======== 서명 =======
주거지는 www.indidev.net 입니다.

cleansugar의 이미지

밀은 무한대 지원하는 라이브러리가 있는데 지수를 지원하는 걸 못 찾겠습니다.

2진수 곱으로 하는 게 *0, *1이니까 간단하고 더 빠를텐데 2진수 라이브러리도 못 찾겠습니다.

실패작:

import org.apfloat.Apint;
import org.apfloat.ApintMath;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
 
public class twopow {
 
	public static void main(String[] args) {
		Apint twoPow = ApintMath.pow(new Apint(2), 10000);
		Writer w = null;
		try{
			File f = new File("2pow.txt");
			w = new BufferedWriter(new FileWriter(f));
			twoPow.writeTo(w,true);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (w != null) {
				w.close();
				}
			} catch (IOException e) {
			e.printStackTrace();
			}
		}
	}
}

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

익명 사용자의 이미지

간단할줄 알았는데..

심플한 알고리즘으로는 100만승까지는 도는데 그 이상은 머리 좀 써야되겠네요 ㅋ

winner의 이미지

계산 후에 400MB(32bit), 540MB(64bit) memory를 점유하고 있는 것을 보면 적시계산을 위한 준비를 하고 있는 것 같지는 않네요. 하지만 출력은 도저히 못하겠네요. math.log10 을 하니 301029995.~ 이 나오는 것을 보면 정확히 계산한 듯 합니다.
CPython 64bit는 1억거듭제곱까지는 계산할 수 있군요. 시간은 좀 걸리지만.... 3.2가 2.7.1 보다 좀더 빠른 듯...

제가 알기로 IronPython은 C#으로 구현한 것으로 아는데 C#을 쓰면 괜찮은 성능이 나오지 않을까요? 출력은... -_-.

익명 사용자의 이미지

그래서 계산 시켜놓으면 빠르게 계산은 해놓는데

10진수로 출력 시키면 진수 변환시키느라 한참 걸리더군요

그냥 처음부터 10진법으로 구해서 결과 뱉는 시간이 더 빠르네요 -_-;

힛갤에 올라가신 분꺼는 아예 처음부터 10진 체계로 계산하는거 같네요.

winner의 이미지

feanor 님이 작성하신 source를 참고해서 10000진법을 사용하고, Strassen이나 카라츠바 곱셈 algorithm을 적용하면 10억거듭제곱을 구하는데 문제는 없을 거라고 봅니다.
큰 수의 진법변환은 매우 시간이 오래 걸리는 작업이죠. 괜히 C 표준에 10진 부동형을 넣을려는게 아닐겁니다.

익명 사용자의 이미지

역시 FFT가 진리죠

swirlpotato의 이미지

이 글을 쓰신분 공비군 입니까?
분위기가 팍 느껴지네요

익명 사용자의 이미지

아니요 프갤 자주 눈팅하던 사람입니다. 공비님이 이야기 하는걸 자주 봤어요

winner의 이미지

3의 천만거듭제곱을 하니 결과가 안 나오는군요. 오히려 CPython이 빠른데... IronPython과 CPython의 구현을 확인해야 정확하겠지만 IronPython의 거듭제곱은 2가 밑일 때 자리수를 이동시키는 기법을 쓰는게 아닌가 하네요.
IronPython도 거듭제곱을 할 때 다중 thread 를 쓰지 않는 것으로 보이고 Karatsuaba algorithm 만 가지고는 단일 thread 로 계산해낼 수 없는 것 같군요. 밑이 2일 때를 가정하지 않고서는 말이죠.

cleansugar의 이미지

Apint twoPow = ApintMath.pow(new Apint(2), 10000);

를 10억으로 고치면 결과가 나옵니다.

100억으로 고치면 int 범위 넘는다고 에러.

Apint twoPow = ApintMath.pow(new Apint(2), new Long("10000000000"));

으로 고치면,

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apfloat.internal.IntMemoryDataStorage.implCopyFrom(IntMemoryDataStorage.java:63)
at org.apfloat.spi.DataStorage.copyFrom(DataStorage.java:611)
at org.apfloat.internal.Int3NTTConvolutionStrategy.autoConvoluteOne(Int3NTTConvolutionStrategy.java:196)
at org.apfloat.internal.Int3NTTConvolutionStrategy.autoConvolute(Int3NTTConvolutionStrategy.java:178)
at org.apfloat.internal.Int3NTTConvolutionStrategy.convolute(Int3NTTConvolutionStrategy.java:117)
at org.apfloat.internal.IntApfloatImpl.multiply(IntApfloatImpl.java:1156)
at org.apfloat.Apfloat.multiply(Apfloat.java:733)
at org.apfloat.Apint.multiply(Apint.java:313)
at org.apfloat.ApintMath.pow(ApintMath.java:66)
at twopow.main(twopow.java:13)

이런 에러가 납니다.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

익명 사용자의 이미지

말그대로 Out of memory네요

cleansugar의 이미지

컴파일러

-Xms m
-Xmx m

옵션 최대로 잡아도 안돼서 64bit java 깔아야 될 듯.

32bit랑 같이 깔면 충돌날 듯한데...

64bit로 하니 다른 에러가 납니다.

Exception in thread "main" org.apfloat.internal.TransformLengthExceededException: Maximum transform length exceeded: 100663296 > 50331648
at org.apfloat.internal.IntFactor3SixStepNTTStrategy.transform(IntFactor3SixStepNTTStrategy.java:132)
at org.apfloat.internal.Int3NTTConvolutionStrategy.autoConvoluteOne(Int3NTTConvolutionStrategy.java:197)
at org.apfloat.internal.Int3NTTConvolutionStrategy.autoConvolute(Int3NTTConvolutionStrategy.java:178)
at org.apfloat.internal.Int3NTTConvolutionStrategy.convolute(Int3NTTConvolutionStrategy.java:117)
at org.apfloat.internal.IntApfloatImpl.multiply(IntApfloatImpl.java:1156)
at org.apfloat.Apfloat.multiply(Apfloat.java:733)
at org.apfloat.Apint.multiply(Apint.java:313)
at org.apfloat.ApintMath.pow(ApintMath.java:66)
at twopow.main(twopow.java:13)

1504780000승까지만 계산됩니다.

크기는 431메가 나오고, AMD Athlon II X3 440 에서 1분 45초 걸렸습니다.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

익명 사용자의 이미지

공비님 2의 30억승 구하셨네요

http://gall.dcinside.com/programming/246509

JuEUS-U의 이미지

참고로 이건 제가 짠겁니다. http://codepad.org/kM1NUDxH
코멘트는 신경 안쓰셔도 됩니다.
뭐 예전일이라 ㅡ,ㅡ);;

기억으로는 저걸 이진수 버전으로 변경해서
64bit 환경에서 백만팩인가 천만팩인가 구하는데 17초가 걸렸습니다.
32bit의 경우는 memcpy를 사용하는게 더 빠르더군요.

익명 사용자의 이미지

unsigned long long a[99999]={1,},p=1,r,s,c;main(n){for(scanf("%d",&n);n>1;r?a

=r,p++:0,n--)for(r=c=0;c<p;c++)s=n*a[c]+r,r=s/1000000000,a[c]=s%1000000000;for(c=p;~--c;printf(c-p+1?"%09llu":"%llu",a[c]));} 

익명 사용자의 이미지

http://ideone.com/UIJze

이 코드 입니다.

kippler의 이미지

이건 팩토리얼이네요..

======== 서명 =======
주거지는 www.indidev.net 입니다.

JuEUS-U의 이미지

단순히 빅인트에 대한 얘기인지라....
원래 프겔에서 이 떡밥(!?)으로 돌기도했고,
팩토리얼이나 2의 10억승이나 단순히 적당히 큰 값을 뽑기위한 도구에 불과하죠.

저 분은 빅인트에 fft, multi-thread(쿼드코어 지원)를 추가한걸로 알고있습니다.
아마 이번 계산에서 멀티쓰레드는 빠지지 않았나 싶지만.

cleansugar의 이미지

10만 팩토리얼 계산 속도
http://kldp.org/node/107470

재미있는 놀이: C, Python, Erlang으로 50000! 해보기 #0
http://kldp.org/node/129044

혹시 (10!)!이 몇 자리의 숫자인지 계산해 보셨나요?
http://kldp.org/node/31380

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com