파이썬과 수(數)

파이썬으로 일상에서 접하는 계산이 가능합니다.
가령,
IPv4 의 갯수는 2^32(232; 2의 32승),
IPv6 의 갯수는 2^128(2
128, 2의 128승)

몇 배나 차이가 날까요 계산해봤습니다.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# IPv6 는 IPv4 보다 몇배나 더 많은가요?

v4 = 2 ** 32
v6 = 2 ** 128

dv = v6 // v4 # 몫(quotient)만 출력
dv_format = format(dv, ".3E") # 10의 거듭제곱으로 재가공

print(type(dv), dv)
print(type(dv_format), dv_format)



(bionic)soyeomul@localhost:~/test$ ./v.py
<class ‘int’> 79228162514264337593543950336
<class ‘str’> 7.923E+28
(bionic)soyeomul@localhost:~/test$

7.923E+28 ===> 동그라미(0) 28개입니다…
아득한… 머나먼 은하수 안드로메다보다 더 먼 우주 어느곳에서 쓸법한 수가 출력되었습니다…
덩달아 저도 정신이 아득해지네여,

비전공자의 입장에서,
파이썬 코드짜다가 수(數)관련 처리를 하면서 고생했던…그래서 더 기억이 나는것들을 적어보려합니다…

꾸벅,

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]
[ibus-hangul(서라운딩 패치판)에서 오타 수정했습니다]

보수는 무엇이고 콤푸타는 왜 보수를 통한 연산을 할수밖에 없는가를 자세히 풀어놨습니다…
읽다보면 콤푸타는 쉽지않다는걸 느낍니다…;;;

파이썬에서의 보수는,

이라고 짧게 정의하고 있네요,

그래서 파이썬에서 뺄셈[피감자-감자=차]을 보수를 통한 연산을 할 경우에… 다음처럼 표현할 수 있습니다.

피감자 ===> x,
감자 ===> y,
감자의 보수 ===> ~y,
차 ===> z

z = x + (~y + 1)


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

x = 0b0110 # 이진수 0110
y = 0b1011 # 이진수 1011

z1 = x - y
z2 = x + (~y + 1)

print("z1:", z1 ,type(z1)) # z1: -5 <class 'int'>
print("z2:", z2, type(z2)) # z2: -5 <class 'int'>

참고문헌:
[1] https://ko.wikipedia.org/wiki/%EB%B3%B4%EC%88%98_(%EC%88%98%ED%95%99)
[2] 보수의 개념과 컴퓨터연산에서의 활용 (주판을 예로 든 보수 개념 설명)
[3] 이글루스 종료 안내
[4] 2의 보수, 보수(Complements)를 이용한 값 구하기
[5] [04-2] Python - 논리연산자/비트연산자 (boolean/bitwise operation)
[6] Bit 연산 Leaning Test (자바 – 마지막 보수 설명 엄청 밀도있게 자세히 풀이해줌)
[7] 05. 비트 연산자(Bitwise Operators) - Python 계단밟기 (파이썬 – 보수를 이용한 뺄셈)
[8] 05. 기본연산자 - 처음코딩 (생활코딩 – 2의 보수와 음수; 강력추천!!!)
[9] binary - two's complement, why the name "two" - Stack Overflow (스택오브플로우의 보수법칙 수학적 고찰)
[10] 2의 보수 - 위키백과, 우리 모두의 백과사전 (위키백과 2의 보수)
[11] Method of complements - Wikipedia (2진수 뺄셈 방법론 – 위키백과(영문))
[12] 1의보수 2의보수에 대한 정리 (1의보수 2의보수에 대한 정리 – 쉽게 설명되어 있음)
[13] https://soooprmx.com/archives/8789 (콤푸타와 수(數)체계에 관한 생각)
[14] 2진수의 덧셈과 2의 보수(complement, 補數)-2 (JoinC – 2의 보수 해설)
[15] http://www.ecogwiki.com/2의_보수법으로_음수_표현하기 (2의 보수법 으로 음수 표현하기)
[16] Bit 연산의 필요성에 대해서 (비트 연산의 필요성)
[17] Alotta's Cave: 10장 - 비트 단위 연산 - AND/OR/XOR/NOT (비트 연산과 집합론 – 하지만 창피하게도 이땅은 수학 문맹국이므로 이런 수학적 논리 따위는 통하지 않는다)
[18] 02-6 집합 자료형 - 점프 투 파이썬 (집합론 구현은 비트연산이 도와준다… 고마워요 비트연산 사랑해요 비트연산!!!)
[19] https://chfhrqnfrhc.tistory.com/entry/비트연산 (하드웨어 제어는 비트연산과 함께~)
[20] 비트 연산 활용 기초 (비트연산을 실전 소프트웨어 처리에서 구현한 예 – 자바)
[21] https://wikidocs.net/7#_6 (파이썬으로도 하드웨어 제어 가능함 – 라즈베리파이^^^)

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]
[크롬OS 에서 생활코딩 해설판을 추가했씁니다]
[ibus-hangul(서라운딩 패치판)에서 위키백과 2의 보수' 및 영문위키백과 2진수 뺄셈 방법론’을 참고문헌으로 추가했씁니다]
[ibus-hangul(서라운딩 패치판)에서 콤푸타와 수체계에 관한 생각을 참고문헌으로 추가했씁니다]
[ibus-hangul(서라운딩 패치판)에서 JoinC 2의 보수 해설을 참고문헌으로 추가했습니다]
[ibus-hangul(서라운딩 패치판)에서 2의보수법 으로 음수 표현하기 해설판을 참고문헌으로 추가했습니다]
[ibus-hangul(서라운딩 패치판)에서 비트연산의 필요성(JoinC)을 참고문헌으로 추가했씁니다]
[ibus-hangul(서라운딩 패치판)에서 하드웨어 제어 및 비트연산을 참고문헌으로 추가했습니다]
[ibus-hangul(서라운딩 패치판)에서 비트연산과 집합론을 참고문헌으로 추가했습니다]
[ibus-hangul(서라운딩 패치판)에서 자바코드에서 쓴 비트연산을 참고문헌으로 추가했씁니다]
[ibus-hangul(서라운딩 패치판)에서 파이썬과 라즈베리파이(위키독스)를 참고문헌으로 추가했습니다]

윗글 스택오브플로우의 보수법칙([참고문헌[9])이 정말 와닿기에 여기에 한번 더 표현합니다.

일반적인 사람이 생각하는 방법의 뺄셈:
  0846
 -0573
= 0273

보수법칙 적용: [십진수 예제]
   0846
  +9427      .. 10's complement of 573 ===> [9427 = 10000-573]
= 10273      .. toss the 'overflow' digit
=  0273      .. same answer

같은 원리로 2진수(binary) 뺄셈도 표기합니다. 윗글 영문 위키백과(참고문헌[11]):

  01100100  [x, equals decimal 100]
- 00010110  [y, equals decimal 22]

덧셈으로 전환:
  01100100  [x]
+ 11101001  [ones' complement of y]
+        1  [to get the two's complement]

=101001110
Dropping the initial "1" gives the answer: 01001110 (equals decimal 78)

2진수 뺄셈[피감자-감자=차(최종결과값)]에서: (윗글 참고문헌[12])
(1) 피감자가 감자보다 크면, 그 최종결과값은 연산결과에서 맨앞 비트 1 을 버린값입니다.
(2) 피감자가 감자보다 작으면, 그 최종결과값은 연산결과의 2의보수를 구한후 음수부호(-) 를 붙인값입니다.

*** 1의보수/2의보수를 구하는 상세한 원리는 윗글 참고문헌[8] 생활코딩 동영상을 살펴보시면 큰 도움이 됩니다 ***

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]
[ibus-hangul(서라운딩 패치판)에서 내용을 교정했습니다]

16진수를 표현해봅니다.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

a = 0xffff # 16진수 4자리

print(hex(a), a) # 0xffff 65535

b0 = (16 ** 0) * 15; b1 = (16 ** 1) * 15
b2 = (16 ** 2) * 15; b3 = (16 ** 3) * 15
b = b0 + b1 + b2 + b3

print(hex(b), b) # 0xffff 65535



#!/usr/bin/env python3
# -*- coding: utf-8 -*-

a = 0b1111111111111111 # 2진수 16자리

print(bin(a), hex(a), a) # 0b1111111111111111 0xffff 65535

[ibus-hangul(서라운딩 패치판)에서 작성했습니다]
bin2hex.jpg
0xffff.jpg

1시간은 60분, 2시간은 120분 등등… 시간 계산에선 60진법이 쓰입니다.

가령, 3시간 24분 47초를 초로 환산하면 다음처럼 표현할 수 있습니다.

(47 * 60^0) + (24 * 60^1) + (3 * 60^2)


$ echo "(47 * 60^0) + (24 * 60^1) + (3 * 60^2)" | bc
12287



$ echo "print((47 * 60 ** 0) + (24 * 60 ** 1) + (3 * 60 ** 2))" | python3
12287

그리고 1년은 12달입니다. 이건 12진법.

10진법/12진법/60진법 은 일상생활에서 사람이 쓰는 진법 체계.
2진법/16진법은 콤푸타가 쓰는 진법 체계.

머지않아 콤푸타 밑바탕에서 3진법도 쓰일 수도 있다는 소식이 들려옵니다.
반도체 관련 이론에서 3진법 체계가 효율성이 있다는 소식입니다.
아직 과학기술 학술지에 정식으로 게재된것이 아닌지라 출처는 보류합니다.

3진법이 쓰인다는 가정하에 소설을 풀어보자면…
지금까지 써오고 있는 2진법과의 연결을 위하야…
두 진법의 호환 진법 체계가 소프트웨어 계층에서 정립되어야 할 거 같다는 생각이 듭니다.
2진법과 3진법의 공통 배수 진법에서 무언가가 될거라 생각하구요,
10진법까지 함께 고려하면 가장 가까운 공통 배수는 60(=2x3x10) 입니다.
게다가 60은 12로도 나누어집니다.

60진법. 갑자기 대단해보이지 않나요^^?

60진법 참고문헌:
(1) 위키백과(한글): 육십진법 - 위키백과, 우리 모두의 백과사전
(2) 위키백과(영문): Sexagesimal - Wikipedia

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]
[크롬OS에서 참고문헌 위키백과 영문판을 추가했습니다]

중국집이 손님으로부터 메뉴를 받아서 주방과 카운터에 알려줄때
5진법/10진법 상호 연계를 합니다…

이는 마치 콤푸타가 2진법으로 입력을 받아서 결과를 10진법으로 출력해주는 방식과 유사합니다.

진법(기수 체계) 을 이해하고 있으면 파이썬으로 수(數) 처리할때에 적지않은 도움이 될거에요_^

[크롬OS 에서 작성했습니다]
[크롬OS 에서 내용을 다듬었씁니다]
20190719_144320.jpg

60진법 적용 예제 코드입니다.



(bionic)soyeomul@localhost:~/test$ cat 660.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# "육십갑자" 또는 "간지" 로 불리는
#  옛 우리 선조분들께서 일상에서 쓰셨던 시간 단위를
#  구문 분석하여 현대의 서기 년도와 일치 시키는 콤푸타 코드입니다.

year = list(range(1419, 2079))
# 1419년 (세종 1년) 부터 한일전 총선 2020년을 포함한 한반도 역사 660년을 리스트에 담습니다.
# 년도가 총 660(60x11)개 입니다.

x = ["기", "경", "신", "임", "계", "갑", "을", "병", "정", "무"] 
y = ["해", "자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술"]
# x 는 천간입니다. 10개의 요소로 구성됩니다.
# y 는 지지입니다. 12개의 요소로 구성됩니다.

x = x * 6 * 11
y = y * 5 * 11
# x => 천간을 660(10x6x11)개로 연속 확장하였습니다.
# y => 지지를 660(12x5x11)개로 연속 확장하였습니다.
# 660은 *천간과 지지의 최소공배수* 즉 60(환갑 또는 회갑)의 배수(정확히 11배수) 입니다.

index = 0
for i in year:
    print("%s\t%s%s年" % (i, x[index], y[index]))
    index += 1
# 본 산법(알고리즘)은 우분투 한국 대화방(20190126)의 서니님께서 알려주셨습니다.
# ^고맙습니다 감사합니다_^))//

# 편집: Emacs 26.2 (Ubuntu 18.04)
# 마지막 갱신: 기해년 칠월 이십일 (양력)

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]
[ibus-hangul(서라운딩 패치판)에서 갱신된 코드를 올렸습니다]

비트 연산자중 “&”, “|” 를 적용시킨 예제 코드입니다.

[ibus-hangul(서라운딩 패치판)에서 작성했습니다]
스크린샷, 2019-07-19 23-38-35.jpg

IPv6 주소를 십진수로 변환하는 코드입니다.

소스코드(파이썬3): https://gitlab.com/soyeomul/test/blob/master/6to10.py

이것으로 파이썬과 수(數) 갈무리합니다.

^고맙습니다 감사합니다_^))//

소여물 황병희 드림

[ibus-hangul(서라운딩 패치판)에서 작성했씁니다]
[ibus-hangul(서라운딩 패치판)에서 디버깅 코드 삽입했습니다]
스크린샷, 2019-07-20 22-30-33.png

[부록]



현대인이 세종때 개발한 물시계의 가치를 알아보지 못하는건 기수 체계를 이해하기 어려운 까닭이라 생각합니다.
세종때 과학자 장영실 같은 분들은 12진법과 100진법(10진법의 확장)을 완벽하게 서로 호환시키는 법을 알고 있었습니다.
현대 콤푸타의 원리를 발견한 독일 수학자 라이프니찌보다 전 세종때의 장영실을 더 존경합니다.

머지않아 3진법의 시대가 온다는 가정하에 잠시 옛 선조분들의 기술력을 되새겨봤습니다.

^고맙습니다 감사합니다_^))//

[크롬OS 에서 작성했습니다]

[부록2]

3진법이 쓰인다는 가정하에 소설을 풀어보자면…
지금까지 써오고 있는 2진법과의 연결을 위하야…
두 진법의 호환 진법 체계> 가 소프트웨어 계층에서 정립되어야 할 거 같다는 생각이 듭니다.

그 호환 체계라함은 3진법과 2진법을 좀 더 포괄적으로 막힘없이 연동가능하고 설명할 수 있는 체계를 이야기합니다.

좀 더 이야기를 확장전개해볼께요,
20세기 최고의 물리 이론은 중력장으로 불리는 거시세계를 설명하는 상대성이론
아주아주 작은 입자들의 세계인 미시세계를 설명하는 양자역학 두 개였습니다.

상대성이론과 양자역학은 서로 상충하여서, 아인슈타인을 비롯한 과학자들은 하나의 절대적 원칙하에서 무리없이 두 이론(상대성이론과 양자역학)을 묶을 수 있으며 설명될 수 있다는 생각에 그 통일된 이론을 찾는작업을 계속 연구해오고 있다고 합니다. 이름하여 **통일장 이론**'으로 불리우는데... 그 통일장 이론의 후보군중에서 현재 초끈이론’[1]이 가장 유력하다고 합니다.
초끈이론의 수학적 증명은 마쳤습니다(성공). 실험만 남아있다고 합니다.
얼마전 유럽입자물리연구소(CERN)에서 시행했던(또는 추가계획[2]) 힉스입자에 관한 실험이 바로 그것이었습니다.
결론 도출은 현직 과학자분들께 맡기고 전 이걸 3진법과 2진법 이야기로 연결시키고 싶습니다.

지금껏 2진법으로 깔린 고속도로를 달렸는데… 이것보다 더 빠른 고속도로가 나타날거다라고 사람들이 이야기합니다. 예 3진법 고속도로인거죠…
하지만 모든 자동차가 2진법 고속도로에 맞춰져 만들어졌으며 운용되고 있는 상태에서 어찌하면 2진법때에 만들어진
자동차를 새로이 만들어질 3진법 고속도로에서도 달릴수 있게 하느냐! 이게 바로 호환 진법 체계 라고 전 정의한거였어요. 비유하자면 콤푸타계의 통일장 이론입니다. 어마무시한 일이 될거에요~

관련 수학자분들과 콤푸타개발자분들 다 머리맞대고 노력하겠지요… 관심갖고 지켜볼께요^^^

참고문헌:

[1] 초끈이론 참고문헌 (한글번역판:19분6초): https://www.youtube.com/watch?v=oL0DivXTwHY (TED 강연 – 브라이언 그린)
[2] Future Circular Collider (FCC): Future Circular Collider - Wikipedia (영문 위키백과)
===> 초대칭입자를 검출할 목적으로 건설될 LHC보다 더 큰 규모의 거대 실험장비. 대략 기획 예산이 28조원에 달한다고함.

[크롬OS 에서 작성했습니다]
[크롬OS 에서 참고문헌을 보강했습니다]