정글에서 온 개발자
음수에서의 모듈러 연산 본문
기본 a%b
- a<0, b>0 일 때 :
- 범위는 0~b-1 사이로 나온다. 즉 결과값이 양수 (C 는 다르게 작동한다.)
- -(|a|%b)+b 를하면 더 편하다. 즉 a를 양수라고 생각하고 모듈러 한 후 b 를 더함
- ex) -10 % 7 = 4
- a>0, b<0 일때 :
- 범위가 0~b+1 사이가 나온다.즉 결과값이 음수
- ex) 10 % -7 = -4
C 와 Python에서의 작동 차이
- 두 정수 a와 b (여기서 b≠0)에 대해, 다음의 관계가 성립한다.
- a=(a//b)×b+(a%b)
- 즉. a%b = a - (a//b)*b
- 한편 정수끼리의 나눗셈에서 다음과 같이 차이가 난다.
- C (truncate toward zero 방식) : 나눗셈의 결과를 0의 방향으로 절삭한다.
- Python (floor 방식): 더 작은 가까운 정수로 결과를 절삭
- 따라서 나눗셈 결과가 음수인 경우 C는 항상 더 큰 정수로, Python은 항상 더 작은 정수가 된다.
- 위 식의 (a//b)*b 나눴다가 곱해 정수화하는 과정에서
- C : 절대값이 항상 a보다 더 작아짐
- Python : 절대값이 항상 a 보다 커짐
- 최종 연산하면
- C : 결과가 항상 음수
- Python : 결과가 항상 양수
- -10 % 7 을 위 식에 따라 따라가면서 비교해보면 이해가 된다.
C는 왜 truncate toward zero 방식을 채택했을까? (출처 GPT)
- 초기의 많은 컴퓨터 아키텍처에서 하드웨어들이 이런 방식으로 작동했다. 따라서 이 방식을 쓰면 하드웨어 연산 뒤 추가 연산이 필요 없다.
- C89/90 에서 음수 나눗셈을 구현에 따라 다를 수 있도록 했기 때문에 항상 truncate toward zero 방식으로 작동하는 것은 아니다.(컴파일러에 따라 다르다.)
결론
파이썬은 모듈러 연산이 항상 양수가 되게 설계해 놓았고, 이를 이용해 list[-1] 과 같은 음수 인덱싱이 가능하다.
'정리' 카테고리의 다른 글
알고리즘의 분석 (0) | 2023.10.17 |
---|---|
알고리즘과 자료구조의 정의 (1) | 2023.10.17 |
파이썬 ‘=’ 이 연산자가 아니다 논란과 주의할 점 (0) | 2023.10.16 |
소수 구하기의 여러가지 방법과 시간복잡도 비교 (0) | 2023.10.16 |
백준 문제 편하게 풀기 (2) | 2023.10.14 |