정글에서 온 개발자

음수에서의 모듈러 연산 본문

정리

음수에서의 모듈러 연산

dev-diver 2023. 10. 15. 00:17

기본 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] 과 같은 음수 인덱싱이 가능하다.