int init_smt(struct s_smc *smc, u_char *mac_addr) { int p ; #if defined(DEBUG) && !defined(DEBUG_BRD) debug.d_smt = 0 ; debug.d_smtf = 0 ; debug.d_rmt = 0 ; debug.d_ecm = 0 ; debug.d_pcm = 0 ; debug.d_cfm = 0 ; debug.d_plc = 0 ; #ifdef ESS debug.d_ess = 0 ; #endif #ifdef SBA debug.d_sba = 0 ; #endif #endif for ( p = 0; p < NUMPHYS; p ++ ) { smc->y[p].mib = & smc->mib.p[p] ; } set_oem_spec_val(smc) ; (void) smt_set_mac_opvalues(smc) ; init_fddi_driver(smc,mac_addr) ; smt_fixup_mib(smc) ; ev_init(smc) ; #ifndef SLIM_SMT smt_init_evc(smc) ; #endif smt_timer_init(smc) ; smt_agent_init(smc) ; pcm_init(smc) ; ecm_init(smc) ; cfm_init(smc) ; rmt_init(smc) ; for (p = 0 ; p < NUMPHYS ; p++) { pcm(smc,p,0) ; } ecm(smc,0) ; cfm(smc,0) ; rmt(smc,0) ; smt_agent_task(smc) ; PNMI_INIT(smc) ; return(0) ; }
/* * Init SMT */ int init_smt(struct s_smc *smc, u_char *mac_addr) /* u_char *mac_addr; canonical address or NULL */ { int p ; #if defined(DEBUG) && !defined(DEBUG_BRD) debug.d_smt = 0 ; debug.d_smtf = 0 ; debug.d_rmt = 0 ; debug.d_ecm = 0 ; debug.d_pcm = 0 ; debug.d_cfm = 0 ; debug.d_plc = 0 ; #ifdef ESS debug.d_ess = 0 ; #endif #ifdef SBA debug.d_sba = 0 ; #endif #endif /* DEBUG && !DEBUG_BRD */ /* First initialize the ports mib->pointers */ for ( p = 0; p < NUMPHYS; p ++ ) { smc->y[p].mib = & smc->mib.p[p] ; } set_oem_spec_val(smc) ; (void) smt_set_mac_opvalues(smc) ; init_fddi_driver(smc,mac_addr) ; /* HW driver */ smt_fixup_mib(smc) ; /* update values that depend on s.sas */ ev_init(smc) ; /* event queue */ #ifndef SLIM_SMT smt_init_evc(smc) ; /* evcs in MIB */ #endif /* no SLIM_SMT */ smt_timer_init(smc) ; /* timer package */ smt_agent_init(smc) ; /* SMT frame manager */ pcm_init(smc) ; /* PCM state machine */ ecm_init(smc) ; /* ECM state machine */ cfm_init(smc) ; /* CFM state machine */ rmt_init(smc) ; /* RMT state machine */ for (p = 0 ; p < NUMPHYS ; p++) { pcm(smc,p,0) ; /* PCM A state machine */ } ecm(smc,0) ; /* ECM state machine */ cfm(smc,0) ; /* CFM state machine */ rmt(smc,0) ; /* RMT state machine */ smt_agent_task(smc) ; /* NIF FSM etc */ PNMI_INIT(smc) ; /* PNMI initialization */ return(0) ; }
// Liefert die Primfaktorzerlegung einer Zahl als String. char *factorize(mpz_t number) { // Primtest (Miller-Rabin). if (mpz_probab_prime_p(number, 10) > 0) return mpz_get_str(NULL, 10, number); mpz_t factor, cofactor; mpz_init(factor); mpz_init(cofactor); char *str1, *str2, *result; int B1 = INITB1, B2 = INITB2, curves = INITCURVES; // Zunaechst eine einfache Probedivision. trial(number, factor, 3e3); if (mpz_cmp_si(factor, 1) == 0) { // Zweite Strategie: Pollard-Rho. do { rho(number, factor, 4e4); } while (mpz_cmp(factor, number) == 0); // Falls immer noch kein Faktor gefunden wurde, mit ECM fortfahren. while (mpz_cmp_si(factor, 1) == 0) { ecm(number, factor, B1, B2, curves); if (mpz_cmp(factor, number) == 0) { mpz_set_si(factor, 1); B1 = INITB1; B2 = INITB2; curves = INITCURVES; continue; } // Anpassung der Parameter. B1 *= 4; B2 *= 5; curves = (curves * 5) / 2; } } mpz_divexact(cofactor, number, factor); str1 = factorize(factor); str2 = factorize(cofactor); result = (char *) malloc(strlen(str1) + strlen(str2) + 4); strcpy(result, str1); strcat(result, " * "); strcat(result, str2); mpz_clear(factor); mpz_clear(cofactor); return result; }
/* ! 適当です ! * 素因数が見つからなかった : 0 * エラー終了 : 1 * 因数が素数で余因数が素数 : 2 * 因数が素数で余因数が合成数 : 4 * 因数が合成数で余因数が素数 : 8 * 因数が合成数で余因数が合成数: 16 */ int main (int argc, char *argv[]) { if (argc <= 1) { fprintf (stderr, "Error: Need two Argument\n"); fprintf (stderr, "Usage: funecm [options] [k]\n"); return 1; } /* オプション処理 */ int opt; while ((opt = getopt (argc, argv, "h")) != -1) { switch (opt) { case 'h': fprintf(stdout, "Usage: funecm [options] [composite number] [k]\n"); fprintf(stdout, "-h: help\n"); return 0; break; default: fprintf(stderr, "No such option\n"); fprintf(stdout, "Usage: funecm [options] [composite number] [k]\n"); return 1; } } /* ARGUMENT CONVERSION */ mpz_t N; mpz_init_set_str(N, argv[optind++], 10); unsigned long int k; k = (unsigned long int)strtol(argv[optind++], NULL, 10); /* 修正予定 */ if (k <= 2) return 0; switch (mpz_probab_prime_p (N, 25)) { case 2: gmp_printf("%Zd is definitely prime\n", N); return 0; break; case 1: gmp_printf("%Zd is probably prime\n", N); return 0; break; case 0: gmp_printf("%Zd is definitely composite\n", N); break; default: break; } AFFINE_POINT P; affine_point_init(P); mpz_t factor; mpz_t cofactor; mpz_init(factor); mpz_init(cofactor); unsigned long int A; for (A = 1; A < A_LOOP; A++) { ecm(factor, N, A, k); mpz_divexact(cofactor, N, factor); /* 因数が1又はNだった場合係数を変えてやり直す */ if (mpz_cmp_ui(factor, 1) == 0 || mpz_cmp(factor, N) == 0) continue; /* ToDo */ /* 終了ステータス */ switch (mpz_probab_prime_p(factor, 25)) { case 2: gmp_printf("factor found: %Zd input number: %Zd\n", factor, N); gmp_printf("cofactor is %Zd\n", cofactor); return 1; break; case 1: gmp_printf("factor found: %Zd input number: %Zd\n", factor, N); gmp_printf("cofactor is %Zd\n", cofactor); return 1; break; case 0: gmp_printf("factor found: %Zd input number: %Zd\n", factor, N); gmp_printf("cofactor is %Zd\n", cofactor); return 1; break; default: break; } } /* メモリの解放*/ affine_point_clear(P); mpz_clear(factor); mpz_clear(cofactor); return 0; }