Skip to content
리눅스/BSD

생코를 보다가~ 이번에는 perl과 + bash + bc 1000000! 팩토리얼 덕후짓!

by 흑엽 posted Aug 01, 2015

오늘 이 테스트는 알고리즘보다는
리눅 bash명령어로 백만개의 곱샘 명령을(1000000!<-팩토리얼 계산) 순수하게 그대로 셀상에서 bc로 넘겼을때 메모리 오버 등등의, 에러 없이 완벽하게 돌아가는지가 너무 궁금해서 해본 덕후짓입니다. 8년전 컴퓨터에 vmware깔고 500매가 가상 램 상황에서 테스트 했습니다.

==========


cat 오늘_생코보고_만든_팩토리얼_계산.pl
#!/usr/bin/perl


my $cmd = "1";
my $loopEnd =$ARGV[0] +1;
my $twoCnt = 0;
for (my $i = 2; $i < $loopEnd; $i++){
        $cmd = $cmd . "*" . $i;
        $twoCnt = $twoCnt  + 1;
        if($twoCnt >= 100) {
 #100마다 출력하지 않으면 문자열이 너무많이 누적됨에 따라 문자열 합치는데만 너무 오래 걸림. 이렇게 하면  0.5초면 1000000개의 곱샘 공식이 담긴 문자열 출력이 완료됨. 만약 한번에 하면 변수가 백만개 정도 누적된때까지  변수의 크기가 증가 됨에 따라 몇십분 이상 걸릴듯... 메모리 오버가 뜰수도 있음. 본인은 10분 기다리다가 귀찬아서 바로...코드 고침...ㅡ.ㅡ;;; 
 # 실행예) time ./해당스크립트.pl 1000000 결과.... $real  0m0.504s시간만큼 걸림. 이것을 또 다시 bash상 큰따음표를 통해서 echo해서 bc로 넘겨 주는것임.
                $twoCnt = 0;
                print $cmd;
                $cmd = ""; #한번 출력을 했기 때문에 자료를 비워준다.
        }
}
print $cmd;# 루프 빠져나간 마지막에도 꼭... 출력해줘야지
==========


프로그램 실행 명령어(time명령어는 프로그램 실행 시간을 체크하기 위함)
time echo `./오늘_생코보고_만든_팩토리얼_계산.pl 1000000`|bc > BcResult.txt
==========


위 프로그램 실행에 걸린 시간
real    661m38.318s <--10시간 넘게 걸림. 돌리고 그냥 잤음ㅡ.ㅡ;;; 어제 블로그에 올린 http://ipc.pe.kr/27317 c언어로 만든것은 5분 걸림. 생코 고수분이 64비트 cpu 8코어 다쓰도록 알고리즘 짜 놓으신 것이 있는데 그건 2초안에 끝남.
user    525m22.858s
sys     135m7.803s
$ ls -lh|egrep BcResult 의 결과
5.5M Jul 31 13:46 BcResult.txt <--계산 결과가 담겨있는 500만자리의 숫자 문자열이 담겨 있는 txt파일 용량.
그리고 어제 c언어로 만든 계산 결과와도 일치함을 WinMerge를 통해 확인!
==========


참고로...
./오늘_생코보고_만든_팩토리얼_계산.pl 1000000
만 했을 경우 위의 코드처럼 문자열  100번 누적될때마 줄바꿈없이 아래와 같은 연산기호를 화면에 뿌려준다.

1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29*30*31*32*33*34*35*36*37*38*39*40*41*42*43*44*45*46*47*48*49*50*51*52*53*54*55*56*57*58*59*60*61*62*63*64*65*66*67*68*69*70*71*72*73*74*75*76*77*78*79*80*81*82*83*84*85*86*87*88*89*90*91*92*93*94*95*96*97*98*99*100*101*102*103*104*105*106*107*108*109*110*111*112*113*114*115*116*117*118*119*120*121*122*123*124*125*126*127*128*129*130*131*132*133*134*135*136*137*138*139*140*141*142*143*144*145*146*147*148*149*150*151*152*153*154*155*156*157*158*159*160*161*162*163*164*165*166*167*168*169*170*171*172*173*174*175*176*177*178*179*180*181*182*183*184*185*186*187*188*189*190*191*192*193*194*195*196*197*198*199*200*201*202*203*204*205*206*207*208*209*210*211*212*213*214*215*216*217*218*219*220*221*222*223*224*225*226*227*228*229*230*231*232*233*234*235*236*237*238*239*240*241*242*243*244*245*246*247*248*249*250*251*252*253*254*255*256*257*258*259*260*261*262*263*264*265*266*267*268*269*270*271*272*273*274*275*276*277*278*279*280*281*282*283*284*285*286*287*288*289*290*291*292*293*294*295*296*297*298*299*300*301*302*303*304*305*306*307*308*309*310*311*312*313*314*315*316*317*318*319*320*321*322*323*324*325*326*327*328*329*330*331*332*333*334*335*336*337*338*339*340*341*342*343*344*345*346*347*348*349*350*351*352*353*354*355*356*357*358*359*360*361*362*363*364*365*366*367*368*369*370*371*372*373*374*375*376*377*378*379*380*381*382*383*384*385*386*387*388*389*390*391*392*393*394*395*396*397*398*399*400*401*402*403*404*405*406*407*408*409*410*411*412*413*414*415*416*417*418*419*420*421*422*423*424*425*426*427*428*429*430*431*432*433*434*435*436*437*438*439*440*441*442*443*444*445*446*447*448*449*450*451*452*453*454*455*456*457*458*459*460*461*462*463*464*465*466*467*468*469*470*471*472*473*474*475*476*477*478*479*480*481*482*483*484*485*486*487*488*489*490*491*492*493*494*495*496*497*498*499*500*501*502*503*504*505*506*507*508*509*510*511*512*513*514*515*516*517*518*519*520*521*522*523*524*525*526*527*528*529*530*531*532*533*534*535*536*537*538*539*540*541*542*543*544*545*546*547*548*549*550*551*552*553*554*555*556*557*558*559*560*561*562*563*564*565*566*567*568*569*570*571*572*573*574*575*576*577*578*579*580*581*582*583*584*585*586*587*588*589*590*591*592*593*594*595*596*597*598*599*600*601*602*603*604*605*606*607*608*609*610*611*612*613*614*615*616*617*618*619*620*621*622*623*624*625*626*627*628*629*630*631*632*633*634*635*636*637*638*639*640*641*642*643*644*645*646*647*648*649*650*651*652*653*654*655*656*657*658*659*660*661*662*663*664*665*666*667*668*669*670*671*672*673*674*675*676*677*678*679*680*681*682*683*684*685*686*687*688*689*690*691*692*693*694*695*696*697*698*699*700*701*702*703*704*705*706*707*708*709*710*711*712*713*714*715*716*717*718*719*720*721*722*723*724*725*726*727*728*729*730*731*732*733*734*735*736*737*738*739*740*741*742*743*744*745*746*747*748*749*750*751*752*753*754*755*756*757*758*759*760*761*762*763*764*765*766*767*768*769*770*771*772*773*774*775*776*777*778*779*780*781*782*783*784*785*786*787*788*789*790*791*792*793*794*795*796*797*798*799*800*801*802*803*804*805*806*807*808*809*810*811*812*813*814*815*816*817*818*819*820*821*822*823*824*825*826*827*828*829*830*831*832*833*834*835*836*837*838*839*840*841*842*843*844*845*846*847*848*849*850*851*852*853*854*855*856*857*858*859*860*861*862*863*864*865*866*867*868*869*870*871*872*873*874*875*876*877*878*879*880*881*882*883*884*885*886*887*888*889*890*891*892*893*894*895*896*897*898*899*900*901*902*903*904*905*906*907*908*909*910*911*912*913*914*915*916*917*918*919*920*921*922*923*924*925*926*927*928*929*930*931*932*933*934*935*936*937*938*939*940*941*942*943*944*945*946*947*948*949*950*951*952*953*954*955*956*957*958*959*960*961*962*963*964*965*966*967*968*969*970*971*972*973*974*975*976*977*978*979*980*981*982*983*984*985*986*987*988*989*990*991*992*993*994*995*996*997*998*999*1000*1001*1002*1003*1004*1005*1006*1007*1008*1009*1010*1011*1012*1013*1014*1015*1016*1017*1018*1019*1020*1021*1022*1023*1024*1025*1026*1027*1028*1029*1030*1031*1032*1033*1034*1035*1036*1037*1038*1039*1040*1041*1042*1043*1044*1045*1046*1047*1048*1049*1050*1051*1052*1053*1054*1055*1056*1057*1058*1059*1060*1061*1062*1063*1064*1065*1066*1067*1068*1069*1070*1071*1072*1073*1074*1075*1076*1077*1078*1079*1080*1081*1082*1083*1084*1085*1086*1087*1088*1089*1090*1091*1092*1093*1094*1095*1096*1097*1098*1099*1100*1101*1102*1103*1104*1105*1106*1107*1108*1109*1110*1111*1112*1113*1114*1115*1116*1117*1118*1119*1120*1121*1122*1123*1124*1125*1126*1127*1128*1129*1130*1131*1132*1133*1134*1135*1136*1137*1138*1139*1140*1141*1142*1143*1144*1145*1146*1147*1148*1149*1150*1151*1152*1153*1154*1155*1156*1157*1158*1159*1160*1161*1162*1163*1164*1165*1166*1167*1168*1169*1170*1171*1172*1173*1174*1175*1176*1177*1178*1179*1180*1181*1182*1183*1184*1185*1186*1187*1188*1189*1190*1191*1192*1193*1194*1195*1196*1197*1198*1199*1200*1201*1202*1203*1204*1205*1206*1207*1208*1209*1210*1211*1212*1213*1214*1215*1216*1217*1218*1219*1220*1221*1222*1223*1224*1225*1226*1227*1228*1229*1230*1231*1232*1233*1234*1235*1236*1237*1238*1239*1240*1241*1242*1243*1244*1245*1246*1247*1248*1249*1250*1251*1252*1253*1254*1255*1256*1257*1258*1259*1260*1261*1262*1263*1264*1265*1266*1267*1268*1269*1270*1271*1272*1273*1274*1275*1276*1277*1278*1279*1280*1281*1282*1283*1284*1285*1286*1287*1288*1289*1290*1291*1292*1293*1294*1295*1296*1297*1298*1299*1300*1301*1302*1303*1304*1305*1306*1307*1308*1309*1310*1311*1312*1313*1314*1315*1316..............(생략!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!).......*999644*999645*999646*999647*999648*999649*999650*999651*999652*999653*999654*999655*999656*999657*999658*999659*999660*999661*999662*999663*999664*999665*999666*999667*999668*999669*999670*999671*999672*999673*999674*999675*999676*999677*999678*999679*999680*999681*999682*999683*999684*999685*999686*999687*999688*999689*999690*999691*999692*999693*999694*999695*999696*999697*999698*999699*999700*999701*999702*999703*999704*999705*999706*999707*999708*999709*999710*999711*999712*999713*999714*999715*999716*999717*999718*999719*999720*999721*999722*999723*999724*999725*999726*999727*999728*999729*999730*999731*999732*999733*999734*999735*999736*999737*999738*999739*999740*999741*999742*999743*999744*999745*999746*999747*999748*999749*999750*999751*999752*999753*999754*999755*999756*999757*999758*999759*999760*999761*999762*999763*999764*999765*999766*999767*999768*999769*999770*999771*999772*999773*999774*999775*999776*999777*999778*999779*999780*999781*999782*999783*999784*999785*999786*999787*999788*999789*999790*999791*999792*999793*999794*999795*999796*999797*999798*999799*999800*999801*999802*999803*999804*999805*999806*999807*999808*999809*999810*999811*999812*999813*999814*999815*999816*999817*999818*999819*999820*999821*999822*999823*999824*999825*999826*999827*999828*999829*999830*999831*999832*999833*999834*999835*999836*999837*999838*999839*999840*999841*999842*999843*999844*999845*999846*999847*999848*999849*999850*999851*999852*999853*999854*999855*999856*999857*999858*999859*999860*999861*999862*999863*999864*999865*999866*999867*999868*999869*999870*999871*999872*999873*999874*999875*999876*999877*999878*999879*999880*999881*999882*999883*999884*999885*999886*999887*999888*999889*999890*999891*999892*999893*999894*999895*999896*999897*999898*999899*999900*999901*999902*999903*999904*999905*999906*999907*999908*999909*999910*999911*999912*999913*999914*999915*999916*999917*999918*999919*999920*999921*999922*999923*999924*999925*999926*999927*999928*999929*999930*999931*999932*999933*999934*999935*999936*999937*999938*999939*999940*999941*999942*999943*999944*999945*999946*999947*999948*999949*999950*999951*999952*999953*999954*999955*999956*999957*999958*999959*999960*999961*999962*999963*999964*999965*999966*999967*999968*999969*999970*999971*999972*999973*999974*999975*999976*999977*999978*999979*999980*999981*999982*999983*999984*999985*999986*999987*999988*999989*999990*999991*999992*999993*999994*999995*999996*999997*999998*999999*1000000
이렇게 문자열로 이루어진 계산식이, 문자열로 이루어진 계산결과보다 크다. 리다이렉션해서 비교해 보면 계산결과는 5.3메가인데 계산식의 경우는 6.57매가임. 곱샘 기호가 포함됨으로 당연히 더 클수 뿐.....
==========


원래는  아래와 같이 셀스크립트로 만들다가 펄이 문자열 생성이 더 빨라서, 순수 셀스크립트로 만든 아래의 코드는 그냥 갔다 버림.

$ cat 오늘_생코에서본_팩토리얼_계산.sh
#!/bin/sh

go="1"

number=2
while [ $number -lt $1 ]
do
        go="${go}*${number}"
        number=`expr $number + 1`
done

go="${go}*${1}"
echo $go "의 계산 결과!!!!:"
#echo $go|bc
=========



리눅스/BSD

생코보다_만든c언어libgmp사용_팩토리얼.c

by 흑엽 posted Jul 31, 2015

리눅스 C언어에서 [엄청~큰 숫자형]을 지원하는 라이브러리를 루트권한에서 설치!
apt-get install libgmp-dev
==============


팩토리얼이란?
https://ko.wikipedia.org/wiki/%EA%B3%84%EC%8A%B9
===========


$ cat 생코보다_만든c언어libgmp사용_팩토리얼.c
#include <stdio.h>
#include <gmp.h>
#include <time.h>
// https://kldp.org/node/129116 여기서 글올리신 분의 코드중에 설명이 필요한 부분에 주석달고, 코드중에는 출력과 입력부분을 수정했습니다.
void factorial(mpz_t* f, unsigned int n)
{
    unsigned int i = 1;

    for (i = 1; i <= n ; i++){ // 파라미터에서 정한 개수 만큼 반복해서 팩토리얼 하는 중. 
        mpz_mul_si(*f, *f, i); // http://gmplib.org/manual/Integer-Arithmetic.html#index-mpz_005fmul_005fsi-285
    }
}

int main(int argc, char **argv)
{
    mpz_t facN; //엄청~큰 변수
    unsigned int n = atol(argv[1]);// 파라미터 1번의 값으로 총 팩토리얼 개수를 정함 
    clock_t start, end;
    double runtime;


    mpz_init(facN); // https://gmplib.org/manual/Initializing-Integers.html#index-mpz_005finit-244
    mpz_set_ui(facN, 1L); //엄청~큰 변수 객체 초기화 등등 https://gmplib.org/manual/Assigning-Integers.html#index-mpz_005fset_005fui-253

   

    start = clock(); //계산시작 타이머
    factorial(&facN, n);//반복해서 팩토리얼 하는 함수 호출
    end = clock(); //계산끝 타이머 종료

   

    runtime = (double)(end-start) / CLOCKS_PER_SEC;
    printf ("실행시간  %f초\n", runtime);
    printf ("이하 파라미터로 지정된 %u의 팩토리얼 계산결과", n);
    mpz_out_str(stdout, 10, facN); //계산완료된 변수를 출력하는 이부분에서... 위의 runtime보다 시간이 더 소모될수 있음. 
    printf("\n");

    mpz_clear(facN);
}
=========


컴파일 명령어
gcc -o생코보다_만든c언어libgmp사용_팩토리얼 생코보다_만든c언어libgmp사용_팩토리얼.c -lgmp
============


실행명렁어
 ./생코보다_만든c언어libgmp사용_팩토리얼 1000000 > 생코보다_만든c언어libgmp사용_팩토리얼result.txt &
============


실행결과->생코보다_만든c언어libgmp사용_팩토리얼result.txt의 내용
실행시간  308.84초(실험용으로 쓰는 vmware에서 돌렸기 때문에, 빠른 컴퓨터에서는 더 좋은 결과가 나올듯)
이하 파라미터로 지정된 1000000의 팩토리얼 계산결과 --> txt파일 용량만 5.8매가이고, 556만자리라 로딩이 안될까봐  유툽 동영상으로 올림. http://youtu.be/1J_nmOL3Mmo


리눅스/BSD

KPW 2012

by 흑엽 posted Nov 30, 2012

제0부_kpw2012 소개_Keedi Kim-keedi
http://goo.gl/ogEI2


제1부_Perl 101_aer0-Seoul.pm perl-kr의 정신적 지주 
http://goo.gl/j4JNX


제2부_p5-hubot_홍형석-aanoaa
http://goo.gl/7CXZk


제3부_넝쿨째 굴러온 김성모. 그의 만화를 앱으로 서비스하기까지_박현우-lqez
http://goo.gl/idhvm <-1편
http://goo.gl/MAF8X <-2편


제4부_여심을 사로잡자 - Notepad 를 활용한 감성적인 편지 만들기_이광헌_perlstudy 
http://goo.gl/gt53b


제5부_조금 깊이 들여다보는 정규표현식_박근영-gypark
http://goo.gl/Ot9EC <-1편
http://goo.gl/3FwJb <-2편


제6부_Catalyst 프레임워크 살펴보기_김진-corund
http://goo.gl/HGnBy <-1편
http://goo.gl/C0xmq <-2편


제7부_동아시아 문자 처리에 대한 간단한 소개-성대현-studioego
http://goo.gl/KMK7v <-1편
http://goo.gl/uBpGw <-2편


제8부_Minimal Perl Web App for Your Minimal Life_Keedi Kim-keedi
http://goo.gl/xsbB0


제9부_Perl Web App 테스트 전략_JEEN_LEE-월급도둑
http://goo.gl/rd81p


제10부_Perl을 위한 Web App 실행 환경 꾸미기_yuni_kim-Yahoo Inc의 시스템 오퍼레이터
http://goo.gl/FPYNE <-1편
http://goo.gl/2LolX <-2편


제11부_Just for fun, Perl (펄 대충 사용하기) - 있어보이는 개발자로 거듭나기_이석철-liepsof
http://goo.gl/ZTZuI <-1편
http://goo.gl/oVwzS <-2편


제12부_Handler Socket으로 MySQL을 NoSQL처럼 쓰기_조성재-jachin24
http://goo.gl/C0z1E <-1편
http://goo.gl/GzKfE <-2편


Board Pagination Prev 1 2 3 4 5 Next
/ 5

Copyright ⓒ 성우 All rights reserved

Powered by SungWoo / Designed by SungWoo

sketchbook5, 스케치북5

sketchbook5, 스케치북5