2013年5月17日金曜日
リュカ・レーマー・テスト最終版netwalker(ARM)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 10000
#define A 800
#define B 1000
#define TXT "lucas7a.txt"
/*
技術評論社 奥村晴彦 著
C言語による最新アルゴリズム事典 2330円+税
P160〜161より引用・改変
A=始める数字
B=計算をここまでの数字までやる
TXT=実行結果を書き込むファイル名
AからBまでの素数のみリュカ・レーマー・テストをする
メルセンヌ素数は、2,3,5,7,13,17,19,31,61,89,107,127,
521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,
19937,21701,23209,44497,86243,110503,132049,216091
リュカ・レーマー・テストのアルゴリズムは
M(P)=2^P-1; として、
x(1)=4;
x(i+1)=(x(i)^2-2) mod M(P)
x(P-1)=0 なら素数
*/
int prime(int p);
double gettime();
double st,pt;
main(){
int p,a=A,b=B,c,m,s,i;
int d,e,f,g,h;
double da,db,dc,dd;
char s1[15]="";
char s2[ 5]="a";
char s3[10]="fail\n";
char s4[25]="from A=%d to B=%d\n";
char s5[15]="file: %s\n";
char s6[15]="CALC START:\n";
char s7[40]="p=%d はM素数 t=%4.2f pt=%4.2f\n";
char s8[50]="p=%d はM素数でない t=%4.2f pt=%4.2f\n";
char s9[35]="CALC END: t=%4.2f pt=%4.2f\n";
char s10[5]="%s";
char s11[19]="\33[0;0HSave File: ";
char s12[13]="From Anum: ";
char s13[13]="To Bnum: ";
char s14[5]="%d";
char s15[10]="\33[2J";
char s16[10]="\n\n\n";
char s17[50]="\33[8;0H\33[Kp=%d はM素数 t=%4.2f pt=%4.2f\n";
char s18[60]="\33[8;0H\33[Kp=%d はM素数でない t=%4.2f pt=%4.2f\n";
FILE *fp;
pt=0.0;
st=0.0;
/* 上の2行はアドレスがころころ変わるのを防ぐ */
/* 今の時点で pt=.L3+68 st=.L3+72 ファイル名はs1に */
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#133");
asm(" bl printf");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#92");
asm(" bl printf");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#73");
asm(" sub r1,fp,#123");
asm(" bl scanf");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#105");
asm(" bl printf");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#123");
asm(" sub r1,fp,#104");
asm(" bl scanf");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#118");
asm(" bl printf");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#123");
asm(" sub r1,fp,#100");
asm(" bl scanf");
asm(" bl gettime");
asm(" ldr r2, .L3+68");
asm(" stmia r2, {r0-r1}");
asm(" sub r0,fp,#123");
asm(" sub r1,fp,#128");
asm(" bl fopen");
asm(" mov r10,r0");
asm(" cmp r10,#0");
asm(" bne T2");
asm(" sub r0,fp,#138");
asm(" bl puts");
asm(" mov r0,#1");
asm(" bl exit");
asm("T2:");
asm(" mov r0,r10");
asm(" sub r1,fp,#163");
asm(" ldr r2,[fp,#-104]");
asm(" ldr r3,[fp,#-100]");
asm(" bl fprintf");
asm(" mov r0,r10");
asm(" sub r1,fp,#178");
asm(" sub r2,fp,#123");
asm(" bl fprintf");
asm(" mov r0,r10");
asm(" sub r1,fp,#193");
asm(" bl fprintf");
asm(" mov r0,r10");
asm(" bl fclose");
asm(" ldr r4,[fp,#-104]");
asm(" ldr r9,[fp,#-100]");
asm(" b U3");
asm("U12:");
asm(" mov r5,r4");
asm(" mov r6,#2");
asm(" b U4");
asm("U8: ");
asm(" mov r3,r6");
asm(" mul r2,r3,r6");
asm(" cmp r2,r5");
asm(" bgt U5");
asm(" mov r0,r5");
asm(" mov r1,r6");
asm(" bl __aeabi_idivmod");
asm(" cmp r1,#0");
asm(" bne U6");
asm(" mov r0,r5");
asm(" mov r1,r6");
asm(" bl __aeabi_idiv");
asm(" mov r5,r0");
asm(" mov r6,#2");
asm(" b U4");
asm("U6: ");
asm(" cmp r6,#2");
asm(" bne U7");
asm(" add r6,r6,#1");
asm(" b U4");
asm("U7: ");
asm(" add r6,r6,#2");
asm("U4:");
asm(" cmp r6,r5");
asm(" ble U8");
asm("U5: ");
asm(" cmp r5,r4");
asm(" bne U9");
asm(" mov r0,r5");
asm(" bl prime");
asm(" cmp r0,#0");
asm(" beq U10");
asm(" bl gettime");
asm(" mov r7,r0");
asm(" mov r8,r1");
asm(" ldr r2,.L3+68");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" str r0,[sp,#0]");
asm(" str r1,[sp,#4]");
asm(" sub r2,fp,#60");
asm(" stmia r2,{r0-r1}");
asm(" mov r0,r7");
asm(" mov r1,r8");
asm(" ldr r2,.L3+72");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" sub r2,fp,#52");
asm(" stmia r2,{r0-r1}");
asm(" mov r2,r0");
asm(" mov r3,r1");
asm(" sub r0,fp,#233");
asm(" sub r0,r0,#210");
asm(" mov r1,r4");
asm(" bl printf");
asm(" sub r0,fp,#123");
asm(" sub r1,fp,#128");
asm(" bl fopen");
asm(" mov r10,r0");
asm(" cmp r10,#0");
asm(" bne T3");
asm(" sub r0,fp,#138");
asm(" bl puts");
asm(" mov r0,#1");
asm(" bl exit");
asm("T3:");
asm(" mov r0,r10");
asm(" sub r1,fp,#233");
asm(" mov r2,r4");
asm(" sub r7,fp,#52");
asm(" ldmia r7,{r7-r8}");
asm(" stmia sp,{r7-r8}");
asm(" sub r7,fp,#60");
asm(" ldmia r7,{r7-r8}");
asm(" str r7,[sp,#8]");
asm(" str r8,[sp,#12]");
asm(" bl fprintf");
asm(" mov r0,r10");
asm(" bl fclose");
asm(" b U9");
asm("U10: ");
asm(" bl gettime");
asm(" mov r7,r0");
asm(" mov r8,r1");
asm(" ldr r2,.L3+68");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" stmia sp,{r0-r1}");
asm(" mov r0,r7");
asm(" mov r1,r8");
asm(" ldr r2,.L3+72");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" mov r2,r0");
asm(" mov r3,r1");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#253");
asm(" mov r1,r4");
asm(" bl printf");
asm("U9:");
asm(" add r4,r4,#1");
asm("U3:");
asm(" cmp r4,r9");
asm(" ble U12");
asm(" sub r0,fp,#123");
asm(" sub r1,fp,#128");
asm(" bl fopen");
asm(" mov r10,r0");
asm(" cmp r10,#0");
asm(" bne T4");
asm(" sub r0,fp,#138");
asm(" bl puts");
asm(" mov r0,#1");
asm(" bl exit");
asm("T4:");
asm(" bl gettime");
asm(" mov r5,r0");
asm(" mov r6,r1");
asm(" ldr r2,.L3+68");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" stmia sp,{r0-r1}");
asm(" mov r0,r5");
asm(" mov r1,r6");
asm(" ldr r2,.L3+72");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" mov r2,r0");
asm(" mov r3,r1");
asm(" mov r0,r10");
asm(" sub r1,fp,#250");
asm(" sub r1,r1,#68");
asm(" bl fprintf");
asm(" mov r0,r10");
asm(" bl fclose");
asm(" sub r0,fp,#250");
asm(" sub r0,r0,#143");
asm(" bl printf");
}
double gettime(){
struct timeval tv;
int a,b,c,d,e;
double da=1e-6,db,dc,dd;
asm(" push {r2,r3,r4}");
asm(" push {r5,r6}");
asm(" sub r0,fp,#80");
asm(" mov r1,#0");
asm(" bl gettimeofday");
asm(" ldr r0,[fp,#-80]");
asm(" bl __aeabi_i2d");
asm(" mov r5,r0");
asm(" mov r6,r1");
asm(" ldr r0,[fp,#-76]");
asm(" bl __aeabi_i2d");
asm(" sub r2,fp,#52");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dmul");
asm(" mov r2,r5");
asm(" mov r3,r6");
asm(" bl __aeabi_dadd");
asm(" pop {r5,r6}");
asm(" pop {r2,r3,r4}");
}
int prime(int p){
char a[N+1],x[N];
int h,i,j,k,s;
int b=N,c=p,d=-10097,e=-20097,f=-20137,g;
double da,db,dc,dd;
char s1[40]="\33[6;0H\33[K%d/%d t=%4.2f pt=%4.2f\n";
char s2[10]="%s";
char s3[10]="s=%s\n";
char s4[10]="%d";
char s5[10]="f=%f\n";
da=pt;
db=st;
/* 上の2行はアドレスがころころ変わるのを防ぐ */
/* 今の時点で pt=.L11+56 st=.L11+60 */
asm(" push {r4,r5,r6,r7,r8,r9,r10}");
asm(" bl gettime");
asm(" ldr r2, .L11+60");
asm(" stmia r2, {r0-r1}");
asm(" ldr r4,[fp,#-72]");
asm(" ldr r2,[fp,#-68]");
asm(" add r1,fp,r2");
asm(" mov r3,#0");
asm(" mov r7,#0");
asm(" b T22");
asm("T23:");
asm(" strb r3,[r1,r7]");
asm(" add r7,r7,#1");
asm("T22:");
asm(" cmp r7,r4");
asm(" blt T23");
asm(" mov r3,#1");
asm(" strb r3,[r1,#2]");
asm(" mov r9,#2");
asm(" b T24");
asm("T34:");
asm(" and r0,r9,#0x1f");
asm(" cmp r0,#0");
asm(" bne S4");
asm(" bl gettime");
asm(" mov r5,r0");
asm(" mov r6,r1");
asm(" ldr r2,.L11+56");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" str r0,[sp,#4]");
asm(" str r1,[sp,#8]");
asm(" mov r0,r5");
asm(" mov r1,r6");
asm(" ldr r2,.L11+60");
asm(" ldmia r2,{r2-r3}");
asm(" bl __aeabi_dsub");
asm(" mov r3,r0");
asm(" str r1,[sp,#0]");
asm(" ldr r0,[fp,#-60]");
asm(" add r0,fp,r0");
asm(" mov r1,r9");
asm(" mov r2,r4");
asm(" bl printf");
asm("S4:");
asm(" ldr r2,[fp,#-68]");
asm(" add r1,fp,r2");
asm(" ldr r2,[fp,#-64]");
asm(" add r0,fp,r2");
asm(" mov r3,#1");
asm(" mov r7,#0");
asm(" b T25");
asm("T26:");
asm(" ldrb r2,[r1,r7]");
asm(" strb r2,[r0,r7]");
asm(" strb r3,[r1,r7]");
asm(" add r7,r7,#1");
asm("T25:");
asm(" cmp r7,r4");
asm(" blt T26");
asm(" mov r3,#0");
asm(" strb r3,[r1,#1]");
asm(" mov r7,#0");
asm(" b T27");
asm("T33:");
asm(" ldr r2,[fp,#-64]");
asm(" add r0,fp,r2");
asm(" ldrb r3,[r0,r7]");
asm(" cmp r3,#0");
asm(" beq T28");
asm(" mov r5,#0");
asm(" mov r6,r7");
asm(" mov r8,#0");
asm(" b T29");
asm("T30:");
asm(" ldr r2,[fp,#-64]");
asm(" add r1,fp,r2");
asm(" ldrb r0,[r1,r8]");
asm(" ldr r2,[fp,#-68]");
asm(" add r1,fp,r2");
asm(" ldrb r2,[r1,r6]");
asm(" add r0,r0,r2");
asm(" mov r2,r5,asr #1");
asm(" add r5,r0,r2");
asm(" and r3,r5,#1");
/*
asm(" str r3,[fp,#-92]");
asm(" push {r0,r1,r2,r3}");
asm(" ldr r2,[fp,#-60]");
asm(" add r0,fp,r2");
asm(" sub r0,r0,#30");
asm(" ldr r1,[fp,#-92]");
asm(" bl printf");
asm(" pop {r0,r1,r2,r3}");
*/
asm(" strb r3,[r1,r6]");
asm(" add r0,r6,#1");
asm(" mov r1,r4");
asm(" bl __aeabi_idivmod");
asm(" mov r6,r1");
asm(" add r8,r8,#1");
asm("T29: ");
asm(" cmp r8,r4");
asm(" blt T30");
asm(" cmp r5,#1");
asm(" ble T28");
asm(" b T31");
asm("T32:");
asm(" ldr r2,[fp,#-68]");
asm(" add r1,fp,r2");
asm(" mov r0,#0");
asm(" strb r0,[r1,r6]");
asm(" add r0,r6,#1");
asm(" mov r1,r4");
asm(" bl __aeabi_idivmod");
asm(" mov r6,r1");
asm("T31:");
asm(" ldr r2,[fp,#-68]");
asm(" add r1,fp,r2");
asm(" ldrb r0,[r1,r6]");
asm(" cmp r0,#0");
asm(" bne T32");
asm(" mov r0,#1");
asm(" strb r0,[r1,r6]");
asm("T28:");
asm(" add r7,r7,#1");
asm("T27:");
asm(" cmp r7,r4");
asm(" blt T33");
asm(" add r9,r9,#1");
asm("T24:");
asm(" cmp r9,r4");
asm(" blt T34");
asm(" ldr r2,[fp,#-68]");
asm(" add r1,fp,r2");
asm(" ldrb r0,[r1,#0]");
asm(" rsb r2,r0,#1");
asm(" strb r2,[r1,r4]");
asm(" mov r7,#1");
asm(" b T35");
asm("T36:");
asm(" add r7,r7,#1");
asm("T35:");
asm(" ldrb r0,[r1,r7]");
asm(" ldrb r2,[r1,#0]");
asm(" cmp r0,r2");
asm(" beq T36");
asm(" cmp r7,r4");
asm(" movne r0,#0");
asm(" moveq r0,#1");
asm(" pop {r4,r5,r6,r7,r8,r9,r10}");
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿