해당 문서의 내용은 본인의 학습 목적으로 정리하였으며,
실제 코딩테스트 시에는 사용이 불가할 수 있으니 참고하시기 바랍니다.
시간이 될 때마다 해당 문서를 계속해서 업데이트 할
import math
from collections import defaultdict, Counter, deque
from queue import Queue, LifoQueue, PriorityQueue
from itertools import combinations, permutations
from heapq import heapify, heappush, heappop
from bisect import bisect_left, bisect_right
math
- 수학 함수ceil
: 올림>> Code
import math
print(math.ceil(3.2))
# 결과 : 4
print(math.ceil(-2.7)))
# 결과 : -2
comb(n,k)
: 조합 버전 3.8에 추가
- 반복과 순서 없이 n 개의 항목에서 k 개의 항목을 선택하는 방법의 수를 반환
- n >= k이면
n! / (k! * (n - k)!)
을, n < k 이면0
을 반환- 식 의 다항식 전개에서 k 번째 항의 계수와 같기 때문에 이항 계수(binomial coefficient)라고도 합니다.
(1 + x) ** n
- 인자 중 어느 하나라도 정수가 아니면
TypeError
를 발생시키고, 인자 중 어느 하나라도 음수이면ValueError
를 발생시킴.
>> Code
import math
print(math.comb(5,2))
# 결과 : 10
copysign(x,y)
: x의 크기(절댓값)와 y의 부호를 갖는 float를 반환
- 단, y가 0인 경우에는 x의 절댓값을 반환
>> Code
import math
print(math.comb(5,-7))
# 결과 : -5
print(math.comb(-7.3,2))
# 결과 : 7.3
print(math.comb(2.4,0))
# 결과 : 2.3
fabs(x)
: x의 절댓값을 반환>> Code
import math
print(math.fabs(2.5))
# 결과 : 2.5
print(math.fabs(-1.2))
# 결과 : 1.2
factorial(x)
: x 계승(factorial을 정수로 반환.
- x가 음수이면
ValueError
를 발생시킴
>> Code
import math
print(math.factorial(5))
# 결과 : 120
floor(x)
: 내림>> Code
import math
print(math.floor(3.2))
# 결과 : 3
print(math.floor(-2.7))
# 결과 : -3
fmod(x,y)
: 부동소수점 나머지계산>> Code
import math
print(math.fmod(5.7, 2,3))
# 결과 : 1.1000000000000005
print(math.fmod(-7.4, -2.1))
# 결과 : -1.1
frexp(x)
: x를 2의 거듭제곱을 이용하여 표현할 때, 가수와 지수를 (m, e) 쌍으로 반환
- m은 float, e는 정수이며, x == m*2**e가 성립
※ 0.5 <= abs(m) < 1 임을 주의할 것
>> Code
import math
print(math.f(10))
# 결과 : (0.625, 4)
print(math.f(8))
# 결과 : (0.5, 4)
fsum(array)
: 이터러블(iterable)
에 있는 값의 정확한(accurate) 부동소수점 합을 반환. 여러 중간 부분 합을 추적하여 정밀도 손실을 방지>> Code
import math
print(sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]))
# 결과 : 0.9999999999999999
print(math.fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]))
# 결과 : 1
gcd(x, y)
: 지정된 정수
인자의 최대 공약수를 반환.
- 버전 3.5에 추가
- 버전 3.9에서 변경 : 임의의 개수 인자에 대한 지원이 추가됨. 이전에는, 단지 두 개의 인자만 지원.
- 모든 인자가 0이거나 인자가 없는 경우(
gcd()
)는 0을 반환.
>> Code
import math
print(math.gcd(36, 24))
# 결과 : 12
print(math.gcd(24, 40, 64))
# 결과 : 8
isclose(a, b, rel_tol = 1e-09 , abs_tol = 0.0 )
: a 와 b가 근접한 것인지 판단하여 True/False
로 반환
- rel_tol : 상대 허용 오차. 허용 오차를 5%로 설정하려면 0.05로 지정하면 됨. default 값은 1e-0.9.
- abs_tol : 최소 절대 허용 오차. 0에 가까운 비교에 유용함. 0 이상의 값을 지정해야 함.
- 에러가 발생하지 않는다면, 결과는 다음과 같음.
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
>> Code
import math
print(math.f())
# 결과 : ~
isfinite(x)
: x가 무한대 혹은 NaN이 아니면 True
를, 그렇지 않으면 False
를 반환
- 버전 3.2에 추가
>> Code
import math
print(math.isfinite(5))
# 결과 : True
isinf(x)
: x가 양 또는 음의 무한대이면 True
를, 그렇지 않으면 False
를 반환>> Code
import math
print(math.isinf(3.7))
# 결과 : False
isnan(x)
: x가 NaN(not a number)이면 True
를, 그렇지 않으면 False
를 반환>> Code
import math
import numpy as np
import pandas as pd
print(math.isnan(np.nan))
# 결과 : True
print(pd.isna(np.nan))
# 결과 : True
isqrt(n)
: 음이 아닌 정수 n
의 정수 제곱근을 반환. -
math.floor(sqrt(n))
과 동일한 결과
a² ≤ n
을 만족하는 가장 큰 정수a
n ≤ a²
을 만족하는 가장 작은 정수 a 즉 n의 정확한 제곱근의 올림을 구할 때 더 유용하게 사용됨. →a = 1 + math.isqrt(n-1)
- `n보다 크거나 같은 최소 제곱수의 밑을 구하기
>> Code
import math
print(math.isqrt(9))
# 결과 : 3
print(math.isqrt(13))
# 결과 : 3
※ 20보다 크거나 같은 최소의 제곱수의 밑을 구하기!
print(1+math.isqrt(20-1))
# 결과 : 3
lcm(n)
: 지정된 정수
인자의 최소 공배수를 반환.
- 버전 3.9에 추가
- 어느 하나의 인자가 0이면 0을 반환.
- 인자가 없는 경우(
lcm()
)은 0을 반환.
>> Code
import math
print(math.f())
# 결과 : ~
ldexp(a, n)
: a * (2**b)
를 반환이것은 본질적으로 함수
frexp()의 역함수
>> Code
import math
print(math.ldexp(3,3))
# 결과 : 24
modf(x)
: x의 소수와 정수 부분을 tuple
형태로 반환
- 두 결과 모두 x의 부호를 가지며 float임
>> Code
import math
print(math.modf(2.7))
# (0.7000000000000002, 2.0)
print(math.modf(-7.3))
# 결과 : (-0.2999999999999998, -7.0)
nextafter(x, y)
: y를 향한 x 다음의 부동 소수점을 반환
- 버전 3.9에 추가
- x가 y와 같으면, y를 반환
- x → y 까지의 수 중 표현할 수 있는 다음 수를 리턴
>> Code
import math
print(math.nextafter(2, 3))
# 결과 : 2.0000000000000004
print(math.nextafter(6, 0))
# 결과 : 5.999999999999999
print(math.nextafter(0, 9))
# 결과 : 5e-324
print(math.nextafter(3.141592, 3.14))
# 결과 : 3.1415919999999997
perm
: 순열
- 반복 없고 순서 있게 n 개의 항목에서 k 개의 항목을 선택하는 방법의 수를 반환
- k <= n이면
n! / (n - k)!
을, k > n이면0
을 반환- 버전 3.8에 추가
>> Code
import math
print(math.perm(5,2))
# 결과 : 20
prod(array)
: 이터러블(iterable)에 있는 모든 요소의 곱을 계산. 곱의 기본 start 값은 1임
- 버전 3.8에 추가
>> Code
import math
print(math.prod([1,3,2,4,5]))
# 결과 : 120
print(math.prod({5,2,4}))
# 결과 : 40
print(math.prod([4,5,6]))
# 결과 : 120
reminder(x,y)
: y에 대한 x의 IEEE 754 스타일 나머지를 반환
- 버전 3.7에 추가
- y의 배수 중 x에 가장 근접한 값을 찾고(더 클 수도 있고 작을 수도 있음), 그 때 x에서 y의 배수를 뺀 값을 return
- 유한한 x 와 0이 아닌 유한한 y에 대해,
x - n*y
를 의미- 여기서
n
은 몫x/y
의 정확한 값에 가장 가까운 정수를 의미x / y
가 두 개의 인접한 정수 사이의 정확히 중간이면, 가장 가까운 짝수 정수가n
으로 사용됨.- 나머지
r = remainder(x, y)
는 항상abs(r) <= 0.5 * abs(y)
를 만족
>> Code
import math
print(math.remainder(15,4))
# 결과 : -1.0
print(math.remainder(22,3))
# 결과 : 1.0
※ x/y 정확히 인접한 정수 사이의 정확한 중간일 때
print(math.remainder(14,4))
# 결과 : -2.0
# ∵ 14 = 4 * 4 - 2 = 4 * 3 - 2 인데, 이런 경우에는 n을 짝수로 선택하기 때문
print(math.remainder(10,4))
# 결과 : 2.0
# ∵ 10 = 4 * 3 - 2 = 4 * 2 - 2 인데, 이런 경우에는 n을 짝수로 선택하기 때문
trunc(x)
: 정수 부분은 남겨두고 소수 부분이 제거된 x 를 반환>> Code
import math
print(math.trunc(2.3))
# 결과 : 2
print(math.trunc(-9.9))
# 결과 : -9
ulp(x)
: x의 최하위 비트 값을 반환
- 버전 3.9에 추가
- ULP는 “Unit in the Last Place(마지막 자리의 단위)”를 의미
- x가
NaN(not a number)
이면,x
를 반환합니다.- x가
음수
이면,ulp(-x)
를 반환합니다.- x가
양의 무한대
이면,x
를 반환합니다.- x가
0
과 같으면,가장 작은 양의 정규화되지 않은(denormalized) 표현 가능한 float
를 반환합니다 (가장 작은 양의 정규화된 float, sys.float_info.min보다 작습니다).- x가
가장 큰 양의 표현 가능한 float
와 같으면,x보다 작은 첫 번째 float가 x - ulp(x)가 되도록, x의 최하위 비트 값을 반환
합니다.- 그렇지 않으면 (x가
양의 유한 수
이면),x보다 큰 첫 번째 float가 x + ulp(x)가 되도록, x의 최하위 비트 값을 반환
합니다.
>> Code
import math
print(math.ulp(3))
# 결과 : 4.440892098500626e-16
print(math.ulp(5.5))
# 결과 : 8.881784197001252e-16
print(math.ulp(-10.2))
# 결과 : 1.7763568394002505e-15
print(math.ulp(0))
# 결과 : 5e-324
exp(x)
: e의 x 거듭제곱을 반환.
- e는 자연로그의 밑(base)
math.e ** x
나pow(math.e, x)
보다 정확함
>> Code
import math
print(math.exp(0))
# 결과 : 0
print(math.exp(1))
# 결과 : 2.718281828459045
print(math.exp(2))
# 결과 : 7.38905609893065
expm1(x)
: e의 x 거듭제곱에서 1을 뺀 값을 반환>> Code
import math
print(math.expm1(0))
# 결과 : 0
print(math.expm1(1))
# 결과 : 1.718281828459045
print(math.expm1(2))
# 결과 : 6.38905609893065
loa(x, a)
: a를 밑(base)로 하는 x의 로그값을 반환
log(x)
: 인자를 하나만 적으면 x의 자연로그를 반환(밑: e)log(x, a)
=log(x) / log(base)
로 계산
>> Code
import math
print(math.log(8,2)
# 결과 : 3.0
print(math.log(25,5)
# 결과 : 2.0
print(math.log(128,8)
# 결과 : 1.75
log1p(x)
: (1+x)의 자연로그를 반환.
- 결과는 0에 가까운 x에 대해 정확한 방식으로 계산됨.
>> Code
import math
print(math.log1p(1))
# 결과 : 0.6931471805599453
print(math.log1p(0))
# 결과 : 0.0
print(math.log1p(0.1))
# 결과 : 0.09531017980432487
log2(x)
: 밑이 2인 x의 로그값을 반환
- 버전 3.3에 추가
>> Code
import math
print(math.log2(8))
# 결과 : 3.0
print(math.log2(1))
# 결과 : 0.0
print(math.log2(20)
# 결과 : 4.321928094887363
log10(x)
: 밑이 10인 x의 로그를 반환.
- 이것은 일반적으로
log(x, 10)
보다 정확함
>> Code
import math
print(math.log10(10))
# 결과 : 1.0
print(math.log10(1))
# 결과 : 0.0
print(math.log10(20)
# 결과 : 1.3010299956639813
pow(x, y)
: x의 y 거듭제곱을 반환
- x가 0이거나 NaN일 때도
pow(1.0, x)
와 `pow(x, 0.0)은 항상 1.0을 반환- x가 음수이고, y가 정수가 아니면 `pow(x, y)는 정의되지 않고 ValueError를 발생시킴
- 내장
**
연산자와 달리,math.pow()
는 두 인자를 모두 float 형으로 변환함.
→ 정확한 정수 거듭제곱을 계산하려면**
나 내장 pow(함수)를 사용할 것.
>> Code
import math
print(math.pow(2,3))
# 결과 : 8.0
print(math.pow(-2, 3))
# 결과 : -8.0
print(math.pow(0, 0))
# 결과 : 1
비교
print(pow(2,3))
# 결과 : 8
print(2**3)
# 결과 : 8
sqrt(x)
: x의 제곱근을 반환
- 결과값은 float type.
>> Code
import math
print(math.sqrt(16))
# 결과 : 4.0
비교
print(16**0.5)
# 결과 : 4.0
degrees(x)
: 각도 x를 radian에서 degree로 변환>> Code
import math
print(math.radians(math.pi))
# 결과 : 180
radians(x)
: 각도 x를 degree에서 radian으로 변환>> Code
import math
print(math.radians(360))
# 결과 : 6.2831853071795869 -> 2π
acos(x)
: x의 arc cosine을 radian으로 반환.
- 결과는 0과 π 사이
>> Code
import math
print(math.acos(0))
# 결과 : 1.5707963267948966 -> π/2
print(math.acos(0.5))
# 결과 : 1.0471975511965979 -> π/3
print(math.acos(1))
# 결과 : 0.0
asin(x)
: x의 arc sine을 radian으로 반환.
- 결과는 -π/2와 π/2 사이
>> Code
import math
print(math.asin(0))
# 결과 : 0.0
print(math.asin(0.5))
# 결과 : 0.5235987755982989 -> π/6
print(math.asin(1))
# 결과 : 1.5707963267948966 -> π/2
atan(x)
: x의 arc tangent을 radian으로 반환.
- 결과는 -π/2와 π/2 사이
>> Code
import math
print(math.asin(0))
# 결과 : 0.0
print(math.asin(0.5))
# 결과 : 0.4636476090008061
print(math.asin(1))
# 결과 : 0.7853981633974483 -> π/4
atan2(y, x)
: atan(y/x)를
radian으로 반환.
- 결과는 -π와 π 사이
- 평면에 있는 원점과 점 (x,y)를 연결한 직선의 기울기
>> Code
import math
print(math.atan2(1,1))
# 결과 : 0.7853981633974483 -> π/4
print(math.atan2(2,1))
# 결과 : 1.1071487177940904
print(math.atan2(1,2))
# 결과 : 0.4636476090008061
cos(x)
: x의 cosine을 반환.
- 결과는 0과 π 사이
>> Code
import math
print(math.cos(0))
# 결과 : 1.0
print(math.acos(math.pi))
# 결과 : -1.0
print(math.asin(-math.pi/3))
# 결과 : 0.5000000000000001
sin(x)
: x의 sine을 radian으로 반환.
- 결과는 0과 π 사이
>> Code
import math
print(math.sin(0))
# 결과 : 1.2246467991473532e-16
print(math.sin(math.pi))
# 결과 : 0.5235987755982989 -> π/6
print(math.sin(-math.pi/2))
# 결과 : -1.0
tan(x)
: x의 tangent를 radian으로 반환.
- 결과는 0과 π 사이
>> Code
import math
print(math.tan(0))
# 결과 : 0.0
print(math.tan(math.pi/4))
# 결과 : 0.9999999999999999
print(math.tan(-math.pi/3))
# 결과 : -1.7320508075688767
dist(p, q)
: 각각 좌표 sequence 혹은 iterable로 제공되는 두 점 p외 q 사이의 유클리드 거리를 반환.
- 버전 3.8에 추가
- 두 점의 차원은 동일해야 함.
sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
를 의미
>> Code
import math
print(math.dist((0,0),(3,4)))
# 결과 : 5.0
print(math.dist([0,0,0], [3,4,12]))
# 결과 : 13.0
hypot(x, y)
: 유클리드 크기(norm) sqrt(sum(x**2 for x in coordinates))
를 반환
- 버전 3.8에서 변경 :
n차원
점에 대한 지원이 추가. 이전에는2차원
만 지원.- 버전 3.10에서 변경 : 최대 오류가 1 ulp(마지막 위치의 단위) 미만이 되도록 알고리즘의 정확도를 개선. 보다 일본적으로 결과는 거의 항상 0.5 ulp 이내로 올바르게 반올림됨.
>> Code
import math
print(math.hypot(3, 4))
# 결과 : 5.0
print(math.hypot(3, 4, 12))
# 결과 : 13.0
print(math.asin(1))
쌍곡선 함수는 원 대신 쌍곡선을 기반으로 하는 삼각 함수의 동류(analog)입니다.
cosh(x)
: x의 쌍곡 코사인(hyperbolic cosine)을 반환>> Code
import math
print(math.cosh(2))
# 결과 : 3.7621956910836314
print(math.cosh(0))
# 결과 : 1.0
sinh(x)
: x의 쌍곡 사인(hyperbolic sine)을 반환>> Code
import math
print(math.sinh(2))
# 결과 : 3.6268604078470186
print(math.sinh(0))
# 결과 : 0.0
tanh(x)
: x의 쌍곡 탄젠트(hyperbolic tangent)를 반환>> Code
import math
print(math.tanh(2))
# 결과 : 0.9640275800758169
print(math.tanh(0))
# 결과 : 0.0
acos(x)
: x의 역 쌍곡 코사인(inverse hyperbolic cosine)을 반환정의역 : x ≥ 1
>> Code
import math
print(math.acosh(2))
# 결과 : 1.3169578969248166
print(math.acosh(1))
# 결과 : 0.0
asin(x)
: x의 역 쌍곡 사인(inverse hyperbolic sine)을 반환>> Code
import math
print(math.asinh(2))
# 결과 : 1.4436354751788103
print(math.asinh(0))
# 결과 : 0.0
atan(x)
: x의 역 쌍곡 탄젠트(inverse hyperbolic tangent)를 반환정의역 : -1 < x < 1
>> Code
import math
print(math.atanh(0.5))
# 결과 : 0.5493061443340549
print(math.atanh(0))
# 결과 : 0.0
erf(x)
: x의 오차 함수를 반환
- 버전 3.2에 추가
- 이 함수는 누적 표준 정규 분포
erf()
와 같은 기존 통계 함수를 계산하는데 사용됨.def phi(x): Cumulative distribution function for the standard normal distribution' return (1.0 + erf(x / sqrt(2.0))) / 2.0
>> Code
import math
erfc(x)
: x의 여오차 함수를 반환
- 버전 3.2에 추가
- 여오차 함수(complementary error function)
erfc(x) = 1.0 - erf(x)
- 뺄셈으로 인해 유효 숫자의 소실이 발생하는 x의 큰 값에 사용됩니다.
>> Code
import math
gamma(x)
: x의 감마 함수(Gamma function)를 반환
- 버전 3.2에 추가
>> Code
import math
lgamma(x)
: x의 감마 함수의 절댓값의 자연로그를 반환
- 버전 3.2에 추가
정의역 : x ≥ 1
>> Code
import math
pi
: 사용 가능한 정밀도로, 수학 상수 π = 3.141592… def phi(x): Cumulative distribution function for the standard normal distribution' return (1.0 + erf(x / sqrt(2.0))) / 2.0
>> Code
import math
print(math.pi)
3.141592653589793
e
: 사용 가능한 정밀도로, 수학 상수 e = 2.718281…>> Code
import math
print(math.pi)
2.718281828459045
tau
: 사용 가능한 정밀도로, 수학 상수 τ = 6.283185… 타우(tau)는 원주와 반지름의 비율인 2π에 해당하는 원 상수
- 버전 3.6에 추가
>> Code
import math
print(math.tau)
6.283185307179586
inf
: 부동 소수점 양의 무한대.
- 버전 3.6에 추가
- 음의 무한대는
-math.inf
를 사용할 것- float('inf')의 출력과 동일
>> Code
import math
print(math.inf)
inf
print(float('inf'))
inf
nan
: A floating-point “not a number” (NaN) value
. Equivalent to the output of float('nan').
- 버전 3.5에 추가
정의역 : x ≥ 1
>> Code
import math
math.nan == math.nan
>>> False
float('nan') == float('nan')
>>> False
math.isnan(math.nan)
>>> True
math.isnan(float('nan'))
>>> True