You are here

큰 수는 내가 처리한다 bignum

admin의 아바타

홈페이지: http://wiki.hping.org/108

bignum은 취급하기 어려운 long형 이상의 큰수를 처리하는 패키지입니다.(큰수를 처리시 제한은 없습니다.) 현재는 그 가능성과 편리함을 인정받아 Tcllib1.7 부터 기본으로 포함 되어 졌습니다.

예제

package require math::bignum
 
set a [math::bignum::fromstr 18446744073709551615]
set b [math::bignum::fromstr 18446744073709551615]
set c [math::bignum::mul $a $b]
 
puts [math::bignum::tostr $c]

위의 코드에서는 unsigned long형의 최대치를 서로 곱하는 예제이며, 결과는 340282366920938463426481119284349108225입니다. bignum 패키지는 처음에 문자열로부터 bignum의 데이타 형으로 변환할 필요가 있습니다.

문자열과 bignum과의 상호변환

문자열로부터 bignum 변환

math::bignum::fromstr string ?base?

bignum으로 부터 문자열 변환

math::bignum::tostr bignum ?base?

계산을 하기전에 반드시 문자열을 bignum의 형태로 기수를 지정하여 변환합니다. 이후 임의의 기수로부터 변환하는 작업을 할수 있습니다.

# 16진수로부터 bignum으로 변환
set a [math::bignum::fromstr fff 16]

# bignum으로부터 2진수로 변환

math::bignum::tostr $a 2

다양한 연산

부호

math::bignum::sign bignum bignum이 음수이면 1을 리턴한다.
math::bignum::abs bignum bignum의 절대치를 리턴한다.
math::bignum::cmp a b a == b 일때 0,a > b 일때 1,a < b 일때 -1을 리턴한다.
math::bignum::iszero bignum bignum이 0일때 1을 리턴한다.

비교연산

math::bignum::lt a b a < b
math::bignum::le a b a < = b
math::bignum::gt a b a > b
math::bignum::ge a b a > = b
math::bignum::eq a b a == b
math::bignum::ne a b a != b

산술연산

math::bignum::isodd bignum bignum이 홀수일때 1을 리턴한다.
math::bignum::iseven bignum bignum이 짝수일때 1을 리턴한다.
math::bignum::add a b a+b
math::bignum::sub a b a-b
math::bignum::mul a b a*b
math::bignum::divqr a b a/b의 몫, 나머지를 리스트로 리턴한다.
math::bignum::div a b a/b
math::bignum::rem a b rem
math::bignum::mod n m mod
math::bignum::pow base exp
math::bignum::powm base exp m
math::bignum::sqrt bignum bignum의 제곱근중 정수 부분만 리턴한다.
math::bignum::rand bits bits를 최고치라 한 난수를 리턴한다.

bit 연산자

math::bignum::lshift bignum bits bignum을 왼쪽으로 시프프
math::bignum::rshift bignum bits bignum을 오른쪽으로 시프트
math::bignum::setbit bignumVar bit bit 셋팅
math::bignum::clearbit bignumVar bit bit를 클리어
math::bignum::testbit bignum bit bit가 1 일때는 1, 0 일때는 -1을, 이외는 0을 리턴한다.
math::bignum::bits bignum bignum을 표현하는데 필요한 bit수를 리턴한다.

마치며

이 bignum패키지는 정수만을 취급하며, 소수점을 취급시에는 bigfloat패키지를 사용하면 됩니다. 사용법은 동일합니다.