[질문] C에서 %연산자로 double 형 연산은 안되나요?

익명 사용자의 이미지

우선 관심가져 주셔서 감사합니다. ^_^;

이번에 RSA 프로그램을 작성하는데 %연산자에서 자꾸 에러가 나더군요.

long powk(long i,long j,long N)
{ double temp=1.0,p=1;

for(temp=0;temp p=(p*((double)i))%((double)N);

return (long)p;
}

// error C2296 '%' illegal, left operand has type 'double '
// error C2297 '%' illegal, right operand has type 'double '

아무리 바꿔도 안됩니다. ㅜ.ㅜ

이 함수는 (I^J)mod(N) 연산하는 함수입니다.
(I,N,J는 무지막지하게 큽니다.)

그러나 P의 결과값은 아주 작습니다..

형변환은 이상이 없는듯한데. 아무리 찾아봐도 %연산자에 관해

자세히 나온 문서는 없더군요. ㅜ.ㅜ

아시는 분은 답변 부탁드립니다. 귀중한 시간 내주셔서 감사합니다.

좋은 하루되세요.

익명 사용자의 이미지

이미 말씀드렸지만..

나머지 연산자 대신..

나눗셈을 하여서.. 그 몫을.. 정수로 한다면.. 그것과 제수..를 곱해주
면.. 그리고 그걸 피제수에서 빼주면.. 나머지값이 나오겠죠?

냐암~

만세~ -_-v

익명 사용자의 이미지

쫑박사님 만세~

만세~

만세~

역쉬 로봇공학뿐만 아니라..프로그램까지.. ㅜ.ㅜ

장난 아빠 만세~

쿨럭~

익명 사용자의 이미지

뭘까...
코미디 같기도 하고...
나눗셈의 나머지 구하는 방법을 몰랐던 걸까...
두 사람이 짜고 치는 고스톱 판 같다는 느낌이 어째... ㅋㅋㅋ

익명 사용자의 이미지

다 그런겁니다.
콜럼부스의 달걀을 생각하시길.. 쩝..

림풀님이 생각을 하지 못했던것 뿐이죠. 아무도 답변도 해줄 생각도 안했거나 못했죠.

답변해드린것까지도 이런식으로 매도하는건.. 게다가 익명으로.. 별로 맘에 들진 않는군요. 짜고치는 고스톱이라.. 그렇게 잘 아시면 답변이라도 좀 해주시지 그랬어요?

이런식의 글은 올리지 마시길 바랍니다. 사람 예의없는것 들통나니까요.

덧. 쫑박사니 뭐니는 #jangnan 채널과 jangnan.org에서 그냥 장난치는 문구일뿐입니다.

익명 사용자의 이미지

그렇게 기분 나쁘셨다니 제가 사과를 드리죠...

그런데 제가 코미디라고 생각한 이유가 몇가지 있습니다.

첫째, double이 결코 필요하지 않을 것 같은 함수에
굳이 long형 변수를 type cast까지 해 가며 double로 형변환을 하고
에러가 난다는 질문 내용 때문입니다.
저라면 왜 double이어야 하는지 반문하는 답글을 올렸을 듯 하네요.

둘째, 답변 내용때문입니다.
double 형을 고집해야 하는 이유를 반문한 것도 아니고,
그렇다면, double 형 변수의 나머지 연산시
왜 컴파일 에러가 나는지에 대한 답변을 한 것도 아니고,
(질문자도 이걸 물어본 거겠죠?)
나머지를 어떻게 구하는지에 대한 너무도 상식적인 내용이었다는 거죠.
(이걸 콜럼부스의 달걀이라 하시나요?)

셋째, 그 답변에 질문자의 너무도 고마워하는,
그리고 그것도 모자라 감탄까지 하는 글이 또 재미있었습니다.
더군다나 두 분이 서로 잘 아시는 사이임을 암시하는 내용도 있었지 않았습니까?
그래서 전 이런 짐작을 했었죠.
kldp 게시판을 방문하는 사람들에게, 특히 저 같은 사람에게
즐거움을 주기 위해서 두 분이 짜고 글 올리셨나 보다 하구요...

불쾌하셨다니 사과드립죠...

익명 사용자의 이미지

아마도 중간에 double를 쓴 이유는 I, J, N 이 아주 커서 오버플로우가
나는 것을 대비해서 한 듯한데요...
실수형 변수의 연산은 어떨수 없이 에러를 포함하지 않나요... 사실 어떤
범위 이하의 값에 대해서는 올바른 결과를 내지만, 일반적으로는 에러를
포함하게 되는 걸로 알고 있답니다...

그래서 어쩔수 없이 정수형만을 써서 구현해야 할거 갑은데요...
사실 long나 int나 모두 32비트이므로 long로 하는게 의미를 가지지는
않을거 같고요...

문제는 I^J 란 값이 int가 나타낼수 있는 범위를 벗어나는게
있을듯한데... I, J가 무지막지하게 크다고 했으니까요...
그러니까 I^J를 직접 구하면 안될듯하네요....

I > N 이고 I = N * a + b 일때
I^J = (Na +b)^N = N *(...) + b^N 이므로
mod(I^J, N) = mod( mod(I,N)^J , N)
....

음... 이건 아직 너무 불완전하고...
mod(I, N)^J에 대해서 또 생각해야 되니까...

여튼 좀 많이 생각해서 해야 될거 같은데... I, J, N이 아주 크다고 생각
했을때...
그렇지 않을까요...

RSA가 어떨지는 모르겠지만 아주 큰 수에 대한 mod(I^J, N)은 좀 생각해
보아야 할 듯한데...

제 논의가 틀린 걸까요???

익명 사용자의 이미지

중간에
I^J = (Na+b)^J = N*(...) + b^J

....
흠...
시험공부해야는데...

뭔가 기막힌 방법이 있을것두 같은데....

익명 사용자의 이미지

X = Na + b, Y = Nc + d 일때,
XY = N(Nac + ad + bc) + bd 임을 이므로,

mod(XY, N) = mod( mod(X, N) * mod(Y, N) , N)

비슷하게 하여 간단히 짜 보았는데요...

J = 2m +n , n = 0 or 1
mod(I^J, N) = mod( mod(I^m, N) * mod(I^m, N) * mod(I^n, N) , N)

정수형으로 표현되는 모든 경우에 대해서 mod(I^J, N)의 계산이 가능할거
같네요...
이론적으로...
그런데 어떤 훨 간단한 방법이 있는지도 모르겠네요....
나누기 2로 들어가니깐 재귀호출의 깊이가 대략 32단계까지만 될듯....

중간에 if에서 J = 0, J = 1 로 바보같은 실수를 해서 엄청 헤맷다는...^^

시험공부하다가 그만 새고 말았네요.... 에고ㅠㅠ
----- mod.c ------------------------------------------------------
#include

unsigned int mod(unsigned int I, unsigned int J, unsigned int N)
{
unsigned int A, B;

if( J == 0 ) return 1;
if( J == 1 ) return (I % N);

A = mod(I, J / 2, N);
B = mod(I, J % 2, N);
return mod(A * A * B, 1, N);
}

int main()
{
unsigned int I, J, N;

I = 3;
J = 4;
N = 5;

printf("mod(%u ^ %u, %u) = %u \n", I, J, N, mod(I, J, N));

}
---------------------------------------------------------------

익명 사용자의 이미지

오버플로우 때문이라고요? ㅋㅋㅋ
그럼 long long 형으로 type cast를 하면 되지
난데없이 double은 뭐죠?

하나만 더 반문합시다.
double 형 변수의 나머지를 어떻게 구할 수 있다고 생각하죠?
1.5를 2로 나누면 나머지가 얼마라고 생각하나요?
몫은 0이고 나머지는 1.5인가요?
아니면 몫이 0.75이고 나머지가 0 이 되나요? ㅋㅋㅋ

익명 사용자의 이미지

시간내서 답변해 주신점 깊이 감사드립니다. ^_^;

첫째. double이어야 하는 이유는 RSA특성상 (long)T^1000000 이상이 됩니
다.long형으로는 오버플로가 발생해서 전혀 다른 쓰레기값이 되버립니다.
물론 결과값에 mod연산을 해주면 결과값은 작아지지만 연산중간에
이미 전혀 다른 값으로 변해버린 수의mod연산은 무의미 합니다.

둘째는 제가 찾아본 결과 %연산자는 정수만 적용된다고 하더군요.
제가 내공이 부족하여 몰랐습니다. ㅜ.ㅜ
그리고 저는 %가 안되는 이유만을 생각했지 나머지의 원리에
관한 생각은 전혀 하지 못했습니다.(솔직히 감탄했습니다.)
초보자의 비애지요. ㅜ.ㅜ

셋째는 전 답변을 해주시는 분께 언제나 감사드립니다. ㅋㅋㅋ님이
제 글을 읽어 주시고 답장을 달아 주시는 점에서도 감사드립니다.
전 이러한 행동이 질문하는 사람의 자세라고 생각합니다.
사랑의 반대말은 무관심이라는 말을 믿고 있거든요.^_^;
물론 쫑아님은 전부터 IRC에서 만나서 이야기를 나누었습니다.
그리고 제가 질문을 먼저 드렸고요. 그리고 제가 겪은 실수를
나중에 누군가가 쉽고 빠르게 찾을수 있다는 점에서 답변은 필요하다고
봅니다.

나중에 쓴 말은 장난채널에서 쓰는 용어들입니다. 장난학 학술용어지요.
즐거움을 원하신다면 jangnan.org 메일링에 가입하세요.(홍보성)

ps너무 심각하게 생각하지 마세요.^_^;

첫째, double이 결코 필요하지 않을 것 같은 함수에
굳이 long형 변수를 type cast까지 해 가며 double로 형변환을 하고
에러가 난다는 질문 내용 때문입니다.
저라면 왜 double이어야 하는지 반문하는 답글을 올렸을 듯 하네요.

둘째, 답변 내용때문입니다.
double 형을 고집해야 하는 이유를 반문한 것도 아니고,
그렇다면, double 형 변수의 나머지 연산시
왜 컴파일 에러가 나는지에 대한 답변을 한 것도 아니고,
(질문자도 이걸 물어본 거겠죠?)
나머지를 어떻게 구하는지에 대한 너무도 상식적인 내용이었다는 거죠.
(이걸 콜럼부스의 달걀이라 하시나요?)

셋째, 그 답변에 질문자의 너무도 고마워하는,
그리고 그것도 모자라 감탄까지 하는 글이 또 재미있었습니다.
더군다나 두 분이 서로 잘 아시는 사이임을 암시하는 내용도 있었지 않 았습니까?
그래서 전 이런 짐작을 했었죠.
kldp 게시판을 방문하는 사람들에게, 특히 저 같은 사람에게
즐거움을 주기 위해서 두 분이 짜고 글 올리셨나 보다 하구요...

불쾌하셨다니 사과드립죠...

익명 사용자의 이미지

전 이렇게 해결했습니다.
i,j,k는 1,000,000이상의 수 입니다.

long pow_(long i,long j,long k)
{
double l,temp,p=1;

for(temp=0;temp < j ; temp++)
{
p=(p*((double)i));
l=(long)(p/k); //소수점 삭제.
p=p-(l*k);
}
return (long)p;
}
mod 연산의 특징을 이용했습니다.

예)
(89^13)%21 = 5

89*89 %21 =4

(4^6*89)%21 = 5

더 좋은 방법 있으시면 한수 가르켜 주세요!
^_^;

익명 사용자의 이미지

오버 플로우 나는 것을 막는다고 한다고 했는데 그만 실수를 해버렸네요...
위에 제가 적은 코드에서
중간에 A*A*B하는 과정에서 충분히 오버를로우가 날 가능성이 있네요...
흠... 어쩔수 없이 double형 타입을 써야 하는 걸까요...
절대로 곱셈같이 그 값이 더 커지는 연산이 들어가면
안되는데... 스스로 모순을 만들어 낸 듯...^^

위에 ㅋㅋㅋ 님이 적어주신 long long 타입을 이번에 알았네요...
그런데 이 타입은 조금 주의해서 써야 될듯하네요...
아직 제대로 테스트해본거는 아니지만...

sizeof(long long)하니까 8바이트 크기를 가지던데...
만약에 I, J, N이 4바이트 크기를 가지는 경우에 그 곱을 8바이트 크기를 가지는
변수에 집어넣는다면 한번의 곱셈에서 오버플로가 날 가능성은
없겠네요...

정수형을 실수형으로 형변환하는 경우에 그 값들이 올바로 전달되는지도 주의해야
될거 같고요... IEEE754 floating-point standard뭐 그런게 있잖아요...
제가 어줍찮게 배운 내용으로는 일단은 형변환에서는 문제가 없는데
그것들을 곱하는 과정에서 마찬가지로 오버날 가능성이 있는거 같은데...
1bit sign, 11bits exponent, 52bits significand이러니까...

그런데 또 인텔에서 또 어떤 확장을 한거 같아서 제대로 나올수도 있겠고....

딴지는 아니고요... ^^
림플님도 한번 확인해 보는 것이 좋을거 같은데... 중간에 곱셉이 들어가잖아요^^
long long타입이 제대로 된거라면 이걸로 형변환해도 좋을 듯...
음... 또 loop를 너무 많이 돌게 되는거 아닌가요^^

좀더 오류없는 코드를 위한 제 논의입니다...
제가 수치해석 때문에 스트레스가 있어서 이런데는 아주 좀 민감해서요....^^

익명 사용자의 이미지

음.. 그렇군요..

저도 long long 타입은 처음 보는지라.. ㅜ.ㅜ

저도 루프를 너무 많다는 생각을 가지고 있었습니다.

그리고 중간에 정수화 시킬때도 오버 플로 가능성이 있다고 생각했구요.

고쳐서 다시 테스트 해봐야 될것 같습니다.

쿨럭~

... wrote..
오버 플로우 나는 것을 막는다고 한다고 했는데 그만 실수를 해버렸네 요...
위에 제가 적은 코드에서
중간에 A*A*B하는 과정에서 충분히 오버를로우가 날 가능성이 있네요...
흠... 어쩔수 없이 double형 타입을 써야 하는 걸까요...
절대로 곱셈같이 그 값이 더 커지는 연산이 들어가면
안되는데... 스스로 모순을 만들어 낸 듯...^^

위에 ㅋㅋㅋ 님이 적어주신 long long 타입을 이번에 알았네요...
그런데 이 타입은 조금 주의해서 써야 될듯하네요...
아직 제대로 테스트해본거는 아니지만...

sizeof(long long)하니까 8바이트 크기를 가지던데...
만약에 I, J, N이 4바이트 크기를 가지는 경우에 그 곱을 8바이트 크기 를 가지는
변수에 집어넣는다면 한번의 곱셈에서 오버플로가 날 가능성은
없겠네요...

정수형을 실수형으로 형변환하는 경우에 그 값들이 올바로 전달되는지 도 주의해야
될거 같고요... IEEE754 floating-point standard뭐 그런게 있잖아요...
제가 어줍찮게 배운 내용으로는 일단은 형변환에서는 문제가 없는데
그것들을 곱하는 과정에서 마찬가지로 오버날 가능성이 있는거 같은 데...
1bit sign, 11bits exponent, 52bits significand이러니까...

그런데 또 인텔에서 또 어떤 확장을 한거 같아서 제대로 나올수도 있겠 고....

딴지는 아니고요... ^^
림플님도 한번 확인해 보는 것이 좋을거 같은데... 중간에 곱셉이 들어 가잖아요^^
long long타입이 제대로 된거라면 이걸로 형변환해도 좋을 듯...
음... 또 loop를 너무 많이 돌게 되는거 아닌가요^^

좀더 오류없는 코드를 위한 제 논의입니다...
제가 수치해석 때문에 스트레스가 있어서 이런데는 아주 좀 민감해서
요....^^

익명 사용자의 이미지


거참 이상하네요..

한줄이면 되지 않나요??????

전아무리봐도 한줄이면 되는거 같은데... 굉장히 어려운것이 많이 나오네
요...ㅡㅡ;;

long powk( long i, long j, long n )
{
return (i^j) - (i^j)/n * n;
}

이거 아닌가요?

익명 사용자의 이미지

c에서 ^이 제곱연산이었나요?
XOR는 뭘로 해야 하나 이제... 큰일났네...
또 한번 ㅋㅋㅋ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.