'★ 수학 이야기/▣ 플밍 이야기'에 해당되는 글 5건

  1. 2011.06.03 2진수로 데이터 표현 1
  2. 2011.06.02 2진수
  3. 2011.06.02 ASCII(American Standard Code for Information Interchange) tables
  4. 2011.02.03 [C/C++] Caesar cipher
  5. 2011.01.02 원주율 근사

 컴퓨터는 2진수를 이용하여 데이터를 저장하고 연산한다.


 1bit은 0인지 1인지 표기하는 일종의 '자리수'고, 1byte는 8bit을 말한다.
1byte에는 0~7까지 총 8개의 자리가 있으므로, 1000 0000 은 10진수로 2^7을 의미한다.
즉, 1byte는 0부터 2^8-1(=255) 까지 총 256개의 숫자를 표현할 수 있다.


컴퓨터는 정수를 표현할 때, 1byte에서 가장 앞 자리 수를 MSB로 남겨둔다.
MSB는 most significant bit의 이니셜로, 부호를 나타낸다.
0이면 양수, 1이면 음수.

음수를 만드는 방법은 간단하다.
해당 값에서 NOT 연산을 취한 후, 1을 더하면 된다.

원리는 inverse element(역원)을 더하는 것이다.
간단하다.

그냥 단순히 MSB를 바꾼다고 음수가 되지 않는다.
올바른 음수를 만드는 방법은 양수의 역원을 찾는 것이다.

그냥 심심해서 색 상자 써 봤다.
ㅋㅋ.


실수는 조금 복잡하다.
2byte를 사용하는데, 하나는 지수부, 하나는 유효숫자를 나타낸다.
즉 16개의 bit가 다음과 같다고 하자.

[] [] [] [] [] [] [] [] // [] [] [] [] [] [] [] []
앞에 진하게 표기된 부분이 MSB이다. s라고 하자.
그 뒤 7개는 지수부를 의미한다. e라고 하자.
마지막 1byte는 유효숫자를 나타낸다. sf라고 하자.
그러면 결과는 다음과 같다.



여기서 sf는 자리수를 생각하지 않고 그냥 넣은 숫자이다.

조금 복잡하다ㅋ


그리고!
위 표기법으로는 0을 만들 수 없다. 항상 양수거나, 음수이다.
r은 0을 지나지 않는다.
그렇기 때문에 오차가 존재한다.

오차에 대한 얘기는 다음으로 미룬다.

'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글

2진수  (0) 2011.06.02
ASCII(American Standard Code for Information Interchange) tables  (0) 2011.06.02
[C/C++] Caesar cipher  (0) 2011.02.03
원주율 근사  (0) 2011.01.02
Posted by White Joker

 n진수는 n개의 숫자로 구성된 수 체계를 말한다. 우리는 0, 1, 2, ..., 9의 총 10개의 숫자를 이용하는 수 체계를 일반적으로 사용하므로, 10진수를 사용한다고 볼 수 있다.

 우리가 새로운 꼬부랑 문자를 첨가하여, 가령 예를 들면 ★을 9+1 의 숫자로 정의하면 11진수를 만들 수도 있다.
그러면 ★ + 7 = 16이 된다. 이 수를 10진수로 변환하면 물론 17이다.

 2진수는 0과 1을 사용하는 수 체계를 말한다. 여기선 1+1 = 10이다. 이 수를 10진수로 변환하면 2가 된다.


 우리는 여기서 재미있는 규칙을 발견할 수 있다.

 n진수에서 10을 10진수로 변환하면 n이 되고, 따라서 n진수의 100을 10진수로 변환하면 n^2이 된다. 같은 방법으로, 1000은 n^3이 된다.

즉, k번째 자리수의 숫자는 n^k의 단위를 가진다.


 우리가 일반적으로 사용하는 10진수 체계에서, 100은 백의 자리수라고 표현하는 것과 같은 이치이다.

 단지 익숙함의 정도 차이이다.
Posted by White Joker

'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글

2진수로 데이터 표현  (1) 2011.06.03
2진수  (0) 2011.06.02
[C/C++] Caesar cipher  (0) 2011.02.03
원주율 근사  (0) 2011.01.02
Posted by White Joker

Caesar cipher는 고대 로마 황제 Julius Caesar가 만든 기본적은 substitution cipher를 말한다.
카이사르 또는 시져라고 읽는다.

http://hypertimespace.tistory.com/150

이전 암호포스트에서 언급한 적 있다.

쓰기 귀찮으니까 글을 옮겨오자면...

암호화는 간단하다. 알파벳을 순환고리라고 생각하고 n번 만큼 알파벳을 옮기면 된다.


n=3
p = ABCZYX
이라고 하면,

c = E_3(p)= DEFCBA
가 된다.

복호는 -n만큼 알파벳을 옮기면 되므로,
d=DEFCBA라고 하면,

p = D_n(c) = ABCZYX
를 얻을 수 있다.

p = ABCZYX
n = 3 (Caesar cipher)
c = E_3(p) = DEFCBA


물론 여기서 E_n^-1 = D_n = E_(-n) 이다.



이게 시저암호다.

이것을 C로 구현해 보자. (C++은 아직 공부 시작도 안했다.....ㅋㅋ)

#include <stdio.h>
int main(void)
{
 char code[100];
 int i=0,j=1;
 printf("문장을 입력해 주세요. \n>");
 gets(code);
 printf("\n%s을 입력하셨습니다.\n\n",code);
 for(;j<26;j++,i=0)
 {
  for(;code[i]!='\0';i++)
  code[i]=decrypt(code, i, j);
  printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code);
 }
 return 0;
}
int decrypt(char code[100], int i, int j)
{
 if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123))
 {
  code[i]++;
  if(code[i]==91)
   code[i]-=26;
  if(code[i]==123)
   code[i]-=26;
 }
 return code[i];
}

뭐 별로 어렵지 않다.

프로그래밍에 투자할 시간은 별로 없지만, 그래도 책 하나 사서 보고 있다. 그래야지 뭐라도 좀 알 수 있겠더라..ㅋㅋ
코드를 해석해 보자.

#include <stdio.h> // stdio라는 이름의 헤더 파일을 불러온다. 기본적인 함수들이 들어가 있다.
int main(void) // integer형태(처음 봤을 땐 initial인줄 알았지ㅋㅋ)를 return하는 main이라는 이름의 함수다. argument는 없다. main이라는 함수는 컴파일 할 때 자동으로 먼저 불러온다.
{
 char code[100]; // character 변수 설정.
 int i=0,j=1; // integer 변수 설정.
 printf("문장을 입력해 주세요. \n>");
 gets(code); // 입력값 받음.
 printf("\n%s을 입력하셨습니다.\n\n",code);
 for(;j<26;j++,i=0) // 이제부터 하나하나 알파벳을 돌리는 거닼ㅋ
 {
  for(;code[i]!='\0';i++) // 입력값들을 하나하나 분석한다. null 문자(마지막에 붙는)가 올 때가지 반복.
  code[i]=decrypt(code, i, j); // decrypt 함수를 사용한다. 변수는 3개ㅋ
  printf("%d 번 위치를 이동시킨 코드 결과:\n%s\n",j,code); // 결과값 출력.
 }
 return 0; // 함수 종료.
}
int decrypt(char code[100], int i, int j) // decrypt 함수 set. interger 형태 반환, 변수는 code, i, j 3개.
{
 if((64<code[i] && code[i]<91)||(96<code[i]&&code[i]<123)) // code의 문자가 영어 대문자와 소문자일 경우.
 {
  code[i]++; // 그 값을 1개씩 증가. (아스키값)
  if(code[i]==91) // Z에서 1개 증가할 경우.
   code[i]-=26; // A값으로.
  if(code[i]==123)
   code[i]-=26;
 }
 return code[i]; // 결과값 return.
}

끝?

끝.

좀 불친절한데? ㅋㅋ



이렇게 총 25번을 반복한다는 거...



영문자만 변환.

'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글

2진수로 데이터 표현  (1) 2011.06.03
2진수  (0) 2011.06.02
ASCII(American Standard Code for Information Interchange) tables  (0) 2011.06.02
원주율 근사  (0) 2011.01.02
Posted by White Joker


오랜만에 LaTeX 글을 올린다.
어쨌거나, 결론은 오일러수나 원주율이나 다항함수로 나타낼 수 있다는 것.

오일러수는 태일러 전개가 적은 텀으로도 충분히 근사가 가능하다.




근데 원주율은 꼭 그렇지만은 않다.

원주율은 다양한 방법이 있는데, 위에 쓴 것처럼 아크탄젠트(1)을 이용[1]해도 되고, 왈리스 프로덕트를 이용[2]해도 된다.

이 외에도, 아크탄젠트(1/2) + 아크탄젠트(1/3) = 아크탄젠트(1)임을 이용[4]해도 된다.

혹은 6*2^n 각형을 이용[3]해서 원주율을 계산해도 된다. (mgeo67님의 방법)

그리고 친구가 알려준 방법[5]이 있는데, 이건 허락을 맡지 않아서 비공개로 해둔다. (엄청나게 빠르고 정확한 원주율 근사 ㄷㄷ n=2 일 때도 3.14159266097 값이 나올 정도다.)
 

python으로 코딩해보았다.

n은 전개한 텀, 혹은 연산 과정의 회수를 의미한다.
15개의 다항함수로 오일러수는 소수점 11번째까지 일치한다.

그레고리 시리즈(아크탄젠트(1))나 왈리스 프로덕트는 백만개의 텀을 더해도 소수점 5번째 자리까지만 일치한다. (그레고리 시리즈는 뒷부분은 일치하는 경향을 보인다.)

mgeo67님의 방법은 파이썬의 자리 수 한계로 n=18 이상에서 오차가 커지기 때문에 n=17로 잡았다. (가장 근사한)

아크탄젠트(1/2)+아크탄젠트(1/3) 은 아크탄젠트(1)에 비해 엄청나게 빠른 속도로 원주율과 가까워진다.
17개의 텀을 더했을 때 벌써 소수점 11자리까지 일치한다.

친구가 알려준 방법은 음.... ㅋㅋㅋㅋ


어쨌거나 초월수도 폴리노미얼로 나타내서 근사하면,
컴퓨터 계산에서도 거의 정확하게 써먹을 수 있다. 직접 입력하는 것보다 낫다.

'★ 수학 이야기 > ▣ 플밍 이야기' 카테고리의 다른 글

2진수로 데이터 표현  (1) 2011.06.03
2진수  (0) 2011.06.02
ASCII(American Standard Code for Information Interchange) tables  (0) 2011.06.02
[C/C++] Caesar cipher  (0) 2011.02.03
Posted by White Joker