ã¯ããã«
æå·ã®åé¡ã解決ããã«ã¯ãç¹å®ã®ã¢ãžã¥ãŒã«ã§2次æ¯èŒã解決ã§ããå¿
èŠããããŸãã äºæ¬¡æ¯èŒãè§£ãããã®ã¢ã«ãŽãªãºã ã¯éåžžã«åçŽã§ãããã¢ãžã¥ãŒã«ã®å°ããªå€ãšèªç±é
ãè§£ãã®ã«å°é£ãåŒãèµ·ãããŸããããæå·åã§ååã«å€§ããªæ°ã䜿çšãããããæåã§äºæ¬¡æ¯èŒãè§£ãããšã¯éåžžã«éªšã®æããé·ãããã»ã¹ã§ãã ãã¡ãããäºæ¬¡æ¯èŒã解決ããã«ã¯ããªã³ã©ã€ã³ãµãŒãã¹ã䜿çšã§ããŸãã ããããæå·åé¡ã®è§£æ±ºã¯äºæ¬¡æ¯èŒã®è§£æ±ºã§çµããããã§ã¯ãªãã®ã§ãæå·ã«æºãã人ãäºæ¬¡æ¯èŒã解決ããããã«ãã£ãŠäœ¿çšãããä»ã®é¢æ°ãšèªç±ã«ããåãã§ããæ©èœãæã£ãŠãããšäŸ¿å©ã§ãã ãã®ãããMATLABã§
x ^ 2â¡aïŒmod pïŒã®åœ¢åŒã®2次æ¯èŒãè§£ã颿°ãäœæããããšã«ããŸãããããã§
ãaãš
pã¯äºãã«çŽ ãªæ°ã§ãã

äºæ¬¡æ¯èŒãè§£ãããã®é¢æ°ãæžãããšã¯æ¬è³ªçã«æè²çã§ãããèšç®ã§äœ¿çšããããŠãŒã¶ãŒé¢æ°ã®äžéšã¯ãMATLABç°å¢ã§æ¢ã«å©çšå¯èœãªé¢æ°ãè€è£œããŠããããšã«ããã«æ³šæããŸãã
æåã«ã2ã€ã®äž»èŠãªé¢æ°ã®ã³ãŒããæ€èšããããšãææ¡ããŸãã1ã€ã¯è€åã¢ãžã¥ãŒã«ã§2次æ¯èŒã解決ããããã®ãã®ã§ã2ã€ç®ã¯åçŽãªã¢ãžã¥ãŒã«ã§2次æ¯èŒã解決ããããã®ãã®ã§ãã åæã«ããŸãäºæ¬¡æ¯èŒãè§£ãããã®ã¢ã«ãŽãªãºã ã«ç²Ÿéããæ¬¡ã«ãèšç®èªäœãå®è¡ããããã«å¿
èŠãªé¢æ°ã«ç²ŸéããŸãã
è€éãªã¢ãžã¥ãŒã«æ¯èŒã解決ããããã®é¢æ°
ãã®é¢æ°ã䜿çšãããšãåçŽã¢ãžã¥ã©ã¹ãšè€çŽ ã¢ãžã¥ã©ã¹ã®äž¡æ¹ã§2次æ¯èŒã解決ã§ããŸãã 颿°ãåŒã³åºããšãã2ã€ã®å€æ°
aãš
pãããã«æž¡ãå¿
èŠããããŸã;ãã®å®è¡ã®çµæãšããŠã颿°ã¯ãã¯ãã«-笊å·ãå察ã®2次æ¯èŒã®2ã€ã®è§£ã®æååãè¿ããŸãã
function [ result ] = sqcomdif( a, p )
äºæ¬¡æ¯èŒãè§£ãæ¬¡ã®ã¹ãããã¯ãã¢ãžã¥ãŒã«
pã®ã¿ã€ããæ±ºå®ããããšã§ãã ãããè¡ãã«ã¯ãæ°å€ãçŽ å æ°ã«åè§£ããããã«èšèšããããŠãŒã¶ãŒå®çŸ©é¢æ°
å æ°åè§£ã䜿çšããŸãã çŽ å æ°ãæã€è¡ãã¯ãã«ã«å ããŠã颿°ã¯çŽ å æ°ã®æ°ãè¿ããŸãã å®éã
å ååè§£é¢æ°ã¯æšæºã®MATLAB
å å颿°ãè€è£œããŸãã
[ mp, sp ] = factorization( p );
æ¡ä»¶æŒç®åã䜿çšããŠã¢ãžã¥ãŒã«ãå ååè§£ãããåŸãå åã®æ°ããã§ãã¯ãããŸãã å åã®æ°ã
1ãè¶
ããå Žåãã€ãŸãã¢ãžã¥ãŒã«
pãåææ°ã§ããå Žåã
späºæ¬¡æ¯èŒã®ã·ã¹ãã ãè§£ãå¿
èŠããããŸãïŒåæ¯èŒã§ã¯ãåæã¢ãžã¥ãŒã«
pã®å åã®1ã€ãã¢ãžã¥ãŒã«ãšããŠæ©èœããŸãïŒã åŸããã2次æ¯èŒã®ã·ã¹ãã ã®è§£æ³ãå®è¡ããåã«ããã®ã·ã¹ãã ã®2次æ¯èŒã®ããããã«è§£ãããããšã確èªããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã乿°
mpã§ãã¯ãã«ã®èŠçŽ éãé·ç§»ãã
forã«ãŒãã䜿çš
ããŸãã ã«ãŒãã®æ¬äœã§ã¯ãæ°å€ã®åãã¢ã®ã«ãžã£ã³ãã«èšå·ã®å€ãèšç®ãã颿°ãåŒã³åºãããŸãã
for i=1:1:sp SL( 1, i ) = symvol( a, mp( 1, i ) );
Legendreã·ã³ãã«ã®å€ã
1ã«çããå Žåã倿°
ã«ãŠã³ãã¯
1å¢å ããŸãã ããã¯ããµã€ã¯ã«ã®ãã¹ãŠã®å埩ãå®äºããåŸãã·ã¹ãã ãæ§æãããäºæ¬¡æ¯èŒã解決ããããå
ã®äºæ¬¡æ¯èŒã«ãªãã¡ãã»ãŒãžã衚瀺ãããã«ãã£ãŠç°ãªããããã·ã¹ãã ã®ãã¹ãŠã®æ¹çšåŒã«è§£ããããã©ããã確èªã§ããããã«ããããã«å¿
èŠã§ã決å®ã
if SL( 1, i ) == 1 count = count + 1;
ã·ã¹ãã å
ã®æ¹çšåŒã®æ°ãè§£ãæã€æ¹çšåŒã®æ°ãšçããå Žåãè¡ãã¯ãã«ãäœæãããŠäžéèšç®çµæãä¿åãããŸãã
if count == sp
forã«ãŒãã䜿çšããŠãã¢ãžã¥ãŒã«
pã®å åéã§é·ç§»ãè¡ãããŸãã
answer1ã® 2次æ¯èŒã®çµæã¯ã
sqcom颿°ã䜿çšããŠååŸãããåçŽãªã¢ãžã¥ãŒã«ã«ãªããŸãããã®ã¢ãžã¥ãŒã«ã«ã¯ã倿°
aã®å€ãšã¢ãžã¥ãŒã«
pã® içªç®ã®å åã®å€ã
answer1ãã¯ãã«è¡ã«æžã蟌ãŸããŸãã ã¢ãžã¥ãŒã«
pã®
içªç®ã®ä¿æ°ã«ããè€åã¢ãžã¥ãŒã«
pã®é€ç®ã®åã¯ãè¡ãã¯ãã«
modulã«æžã蟌ãŸããŸãã ç·åœ¢äžçåŒ
ïŒp / pïŒIïŒïŒ* yâ¡1ïŒpïŒiïŒïŒãè§£ããçµæã¯ãäžåœã®å®çããåŸãããåŒã«åŸã£ãŠæçµçãªçããèšç®ããããã«å¿
èŠã§ããã
answer2ãã¯ãã«è¡ã«ä¿åãããŸãã
ãµã€ã¯ã«ã®å®è¡ãå®äºããããæ¬¡ã®åŒã«åŸã£ãŠæçµåçãèšç®ããå¿
èŠããããŸãïŒ
x =ïŒïŒp / pïŒ1ïŒïŒ* bïŒ1ïŒ* yïŒ1ïŒ+ïŒïŒp / pïŒ2ïŒïŒ* bïŒ2 ïŒ* yïŒ2ïŒ+ïŒïŒp / pïŒiïŒïŒ* bïŒiïŒ* yïŒiïŒ ããããè¡ãã«ã¯ãèŠçŽ ããšã®ä¹ç®ã䜿çšããŸãããã®çµæãè¡ãã¯ãã«ãååŸããŸãããã®åèšã¯ã
sumã³ãã³ãã䜿çšããŠèŠã€ããããšãã§ããŸããåèšãè€åã¢ãžã¥ãŒã«
pã§é€ç®ããæ®ãã®éšåãèŠã€ããŸã-ããã¯è€åã¢ãžã¥ãŒã«ã«ãã2次æ¯èŒã®è§£æ±ºçã®1ã€ã«ãªããŸãã
æåã«ã¢ãžã¥ãŒã«
pãçŽ æ°ã§ããããšã倿ããå Žåãäºæ¬¡æ¯èŒ
-sqcomãè§£ã颿°ã®1åã®åŒã³åºãã§äºæ¬¡æ¯èŒè§£ãåŸãããŸãã 2çªç®ã®è§£ã¯ãå察ã®ç¬Šå·ãæã€æåã®åçãååŸããããšã«ããåŸãããŸãã
else result( 1, 1 ) = sqcom( a, p ); result( 1, 2 ) = - result( 1, 1 ); end
以äžã¯ãsqcomdif颿°ã®å®å
šãªã³ãŒãã§ãã
function [ result ] = sqcomdif( a, p ) % % , % . , % , . [ mp, sp ] = factorization( p ); if sp > 1 % count = 0; % % for i=1:1:sp SL( 1, i ) = symvol( a, mp( 1, i ) ); if SL( 1, i ) == 1 count = count + 1; % count 1 end end % if count == sp % answer1 = zeros ( 1, sp ); % modul = zeros ( 1, sp ); % answer2 = zeros ( 1, sp ); % . % for i=1:1:sp answer1( 1, i ) = sqcom( a, mp( 1, i ) ) ; modul( 1, i ) = p / mp( 1, i ); answer2( 1, i ) = lincom ( modul( 1, i ), 1, mp( 1, i ) ); end % result = zeros ( 1, 2 ); result( 1, 1 ) = mod( sum( ( modul .* answer1 ) .* answer2 ), p ); result( 1, 2 ) = - result( 1, 1 ); else result = 'net resheniy'; end else result( 1, 1 ) = sqcom( a, p ); result( 1, 2 ) = - result( 1, 1 ); end end
ç°¡åãªäºæ¬¡æ¯èŒãè§£ã颿°
ãã®é¢æ°ã¯
sqcomdif颿°ã§ç¹°ãè¿ãåŒã³åºãããŠãããæ¢ã«è¿°ã¹ãããã«ã
sqcom颿°
ã¯åçŽãªã¢ãžã¥ãŒã«ã§2次æ¯èŒã解決ããããã«äœ¿çšããã
sqcomdif颿°ã«é¢ä¿ãªãåŒã³åºãããšãã§ããŸããã€ãŸããåé¡ãªãåŒã³åºãããšãã§ããæ£ããçããåŸãããšãã§ããŸãã¢ãžã¥ãŒã«ãçŽ æ°ã§ããããšã
x ^ 2â¡aïŒmod pïŒã®åœ¢åŒã®2次æ¯èŒã®å¥å¥ªã®ã¿
ãèæ
®ãããããã倿°
aããã³
pã®æ°å€ã颿°ã«è»¢éããå¿
èŠããããŸãã 颿°ã®çµæãšããŠã2次æ¯èŒã®1ã€ã®è§£ãåŸãããŸãã
function [ answer ] = sqcom( a, p )
sqcom颿°ã¯sqcomdif颿°ãšã¯å¥ã«äœ¿çšã§ããããã倿°
aã«æžã蟌ãŸããæ°å€ãã¢ãžã¥ãŒã«
pã® 2次å°äœã§ããããšã確èªããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã
symvol颿°ã䜿çšããŸããããã«ãããæå®ãããæ°å€ã®ãã¢ã®ã«ãžã£ã³ãã«èšå·ã®å€ãèšç®ã§ããŸãã
[ Symvol_Lejandra ] = symvol( a, p );
倿°
Symvol_Lejandraã®å€ã
1ã®å Žåãaã¯
pãæ³ãšãã2次å°äœã§ããã2次æ¯èŒã®è§£ãèŠã€ããããã«ããã«ã¹ããããå®è¡ãããŸãã
2 ^ r * qã®åœ¢åŒã§æ°å
ïŒp-1ïŒãæžãå¿
èŠããããŸãã 倿°
r ã
qã®åæå€ã¯ã
ïŒp-1ïŒã奿°ã§ããèšç®ããèšå®ãããŸãã ãã ããããã§ãªãå Žåã¯ããµã€ã¯ã«ã®å®è¡äžã«å€æŽãããŸãïŒ
qã奿°ã«ãªããŸã§ïŒã
q = p - 1; r = 0; otn = q / 2; while ( ( q - floor( otn ) * 2 ) == 0 ) q = otn; r = r + 1; otn = q / 2; end
ããã§ã
b = a ^ qïŒmod pïŒã«çãã倿°
bã®å€ãèŠã€ããå¿
èŠããããŸãã éåžž
ãaãš
qã¯ååã«å€§ããæ°ã§è¡šããããããã»ãšãã©ã®å ŽåãªãŒããŒãããŒãçºçãããã
ãéåžžã®æ¹æ³ã§
aã
qä¹ããããšã¯ã§ããŸããã ãããã£ãŠãã¹ãä¹ã¯å¹³æ¹ã®æ¹æ³ã§å®è¡ããå¿
èŠããããŸãã ãããå®çŸããã«ã¯ã
kvadrirovanie颿°ãåŒã³åºããŠãããŒã¹ãææ°ãããã³èšç®ãå®è¡ããã¢ãžã¥ãŒã«ã®å€ãæž¡ãå¿
èŠããããŸãã
b = kvadrirovanie( a, q, p );
èšç®ãç¶è¡ããã«ã¯ãæå°ã®éè² æ°
fãèŠã€ããå¿
èŠããããŸããããã¯ã
pãæ³ãšãã2次ã®éå°äœ
æ°ã«ãªããŸãã ãã®å€æ°
fã«ã¯å€
1ãå²ãåœãŠããã颿°
symvolã䜿çšããŠãæ°å€
fãš
pã®ãã¢ã®ã«ãžã£ã³ãã«èšå·ã®å€
ãæ±ºå®ãããŸãã
1ãš
pã®ã«ãžã£ã³ãã«èšå·ã
1ã®å Žåã倿°
fã¯ã
whileã«ãŒãã®å©ããåããŠãå€ã«éãããŸã§å¢å ããŸããããã¯ã
pãæ³ãšãã2次éå°äœã§ãã
f = 1; sym_lej = symvol( f, p ); while sym_lej ~= -1 f = f + 1; sym_lej = symvol( f, p ); end
ããã§ã
pãæ³ãšãã2次ã®éå°äœã§ãã
fã®å€ã
qã®çޝä¹ã«äžããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã颿°
kvadrirovanieã䜿çšããå¿
èŠããããŸãã倿°
kã«ã¯å€
0ãå²ãåœãŠãå¿
èŠããããŸãã
g = kvadrirovanie( f, q, p); k = 0;
äžèšã®æé ã®åŸã倿°
bã®å€ã確èªããå¿
èŠããããŸãã
bã 1ã¢ãžã¥ã
pã«å¹æµããå Žåãçãã®èšç®ã«é²ãå¿
èŠããããŸã;ãããªããã°ã
b ^ïŒ2 ^ mïŒâ¡1ïŒmod pïŒãšãªãæå°ã®éè² æ°
mãèŠã€ããŸãã ãã®ãããª
mã®å€ãèŠã€ãã£ãå Žåã倿°
k ã
g ã
bã®å€ãåèšç®ããå€
mã倿°
rã«å²ãåœãŠãå¿
èŠããããŸãã ããããããã ãã§ã¯ãããŸããã倿°
bã®æ°ããå€ã
p modulo
1ãšæ¯èŒå¯èœã§ããããšã確èªããå¿
èŠããããŸãã ããã§ãªãå Žåã¯ãçªå·
mã®éžæã«æ»ãå¿
èŠã
ãããŸãã 倿°
pok㯠ãç¹å®ã®æ°åŠæŒç®ã2åå®è¡ããããšãé¿ããããã«å¿
èŠã§ãã
if b ~= 1 while b ~= 1 m = 0; b1 = kvadrirovanie( b, 2^m, p ); while mod( b1, p) ~= 1 m = m + 1; b1 = kvadrirovanie( b, 2^m, p ); end pok = 2^(rm); g1 = kvadrirovanie( g, pok, p ); b = mod( ( b*g1), p ); k = fix(k + pok); r = m; end end
äžèšã®æ¡ä»¶ãæºãã
mãèŠã€ãã£ãåŸãçãã®çŽæ¥èšç®ã«é²ãããšãã§ããŸãã çãã¯ãåŒ
x = a ^ïŒïŒq + 1ïŒ/ 2ïŒ* g ^ïŒk / 2ïŒïŒmod pïŒã«ãã£ãŠèšç®ãããŸãã äž¡æ¹ã®ä¿æ°ãèšç®ããã«ã¯ã2ä¹é¢æ°ã䜿çšãã
pãæ³ãšããçµæãååŸããŸãã
first = kvadrirovanie( a, ( ( q + 1 ) / 2 ), p ); second = kvadrirovanie( g, ( k / 2 ), p ); answer = mod( ( first * second ), p);
åŸãããçµæã¯åžžã«
pãæ³ãšããŠæé©ã«èšè¿°ã§ãããšã¯éããŸããã ãããã£ãŠã次ã®ãã§ãã¯ãå®è¡ããå¿
èŠããããŸãã
delta = p - answer; if delta < answer answer = delta; end
以äžã¯ãå®å
šãª
sqcomæ©èœ
ã³ãŒãã§ã ã
function [ answer ] = sqcom( a, p ) % % % x^2 = a ( mod p ) , % . % . a=mod(a,p); % 1 [ Symvol_Lejandra ] = symvol( a, p ); if Symvol_Lejandra == 1 % 2 q, r, b q = p - 1; r = 0; otn = q / 2; while ( ( q - floor( otn ) * 2 ) == 0 ) q = otn; r = r + 1; otn = q / 2; end b = kvadrirovanie( a, q, p ); % 3 f f = 1; sym_lej = symvol( f, p ); while sym_lej ~= -1 f = f + 1; sym_lej = symvol( f, p ); end g = kvadrirovanie( f, q, p); k = 0; % 4 if b ~= 1 while b ~= 1 m = 0; b1 = kvadrirovanie( b, 2^m, p ); while mod( b1, p) ~= 1 m = m + 1; b1 = kvadrirovanie( b, 2^m, p ); end pok = 2^(rm); g1 = kvadrirovanie( g, pok, p ); b = mod( ( b*g1), p ); k = fix(k + pok); r = m; end end % 5 first = kvadrirovanie( a, ( ( q + 1 ) / 2 ), p ); second = kvadrirovanie( g, ( k / 2 ), p ); answer = mod( ( first * second ), p); delta = p - answer; if delta < answer answer = delta; end else answer = 'net resheniya'; end
ãããŠä»ãäºæ¬¡æ¯èŒãè§£ãéã«äœ¿çšãããè£å©é¢æ°ã«ç²Ÿéããããšãææ¡ããããããå¥ã
ã«äœ¿çšã§ããããã«ããŸãã

æ°å€ã®å æ°åè§£
äºæ¬¡æ¯èŒãè§£ãå Žåãå€ãã®å Žåãæ°å€ã®å æ°åè§£ã«é Œãå¿
èŠããããæ°å€ãçŽ æ°ã§ãããè€åã§ãããã確èªããå¿
èŠãããå Žåã«ãããã®æäœã䜿çšããå¿
èŠããããŸãã
å æ°åè§£é¢æ°ã«ã¯ã
å æ°åè§£ããå¿
èŠãããæ°å€ãæž¡ãããŸãã çµæãšããŠã颿°ã¯ãã¯ãã«ãè¿ããŸã-å åãšãããã®å åã®æ°ãæã€è¡ã
function [ mnojitel, ind ] = factorization( delimoe )
ãã®é¢æ°ã¯ãå
¥å倿°
delimoeã®å€ã«å¿ããŠããŸããŸãªã¢ã¯ã·ã§ã³ãå®è¡ãã
switchã¹ããŒãã¡ã³ãã§æ§æãããŠããŸãã ãããã£ãŠã
delimoe = 1ã®å Žåã
mnojitelã¯å ååè§£ã®çµæãæ ŒçŽãããã¯ãã«ã®
1ã«æžã蟌ãŸãã
1ã¯å åã®æ°ãæ ŒçŽãã倿°
indã« ãæžã蟌ãŸããŸãã
delimoeã
-1ã®å Žåãåæ§ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
switch delimoe case { 1 } mnojitel( 1, 1 )=1; ind=1; case { -1 } mnojitel( 1, 1 )= -1; ind = 1;
ãããã®æ¡ä»¶ãæºããããªãå Žåãå æ°åè§£ãããæ°å€ã®ç¬Šå·ã確èªããŸãã
delimoeã 0ããå°ããå Žåãæåã®ãã¡ã¯ã¿ãŒã«
-1ãæžã蟌ãŸãã
indã« 2ãæžã蟌ãŸãã颿°ã¯
delimoe倿°ã®ã¢ãžã¥ãŒã«ã§åŒãç¶ãåäœããæ°å€ã
0ãã倧ããå Žåãå€
indã«
1 ãå²ãåœãŠãããŸãã
otherwise if delimoe < 0 mnojitel( 1, 1 )= -1; ind = 2; delimoe = abs ( delimoe ); else ind = 1; end
whileã«ãŒãã¯ã
delimoeã
delitelã«çãããªããŸã§å®è¡ãããå€
deltaã¯æåã«
2ã« èšå®ãããŸãã ã«ãŒãã®åå埩ã§ã
ããªã¢ã
ããªãã«ã§é€ç®ããäœãã
ostatok倿°ã« æžã蟌ãŸã ãŸã ã å°äœã
0ã®å Žåãã€ãŸãã
ããªãã«ã
ããªã¢ãã¡ã¯ã¿ãŒã§ããå Žåããã®å€ã¯ããã¡ã¯ã¿ãŒãæ ŒçŽãããŠãããã¯ãã«ã«æžã蟌ãŸãããã®ãã¯ãã«ã®ã«ãŠã³ã¿ãŒã¯
1å¢å ããŸãã ãã®å Žåã倿°
delimoeã«ã¯ ãå®è¡ãããé€ç®ã®å
ãå²ãåœãŠãããŸãã é€ç®ã®æ®ãã
0ã«çãããªãå Žåã
ããªãã«ã¯
1 ãã€å¢å ããŸãã ã«ãŒããçµäºãããšã
delimoe倿°ã«æ®ã£ãŠããå€ããèŠå ã®1ã€ãšããŠãèŠå ãšãšãã«ãã¯ãã«ã«æžã蟌ãŸããŸãã
while ( delimoe ~= delitel ) ostatok = mod( delimoe, delitel ); if ostatok ~= 0 delitel = delitel + 1; else delimoe = delimoe / delitel; mnojitel( 1, ind ) = delitel; ind = ind + 1; end end mnojitel( 1, ind ) = delimoe;
以äžã¯ã
åè§£é¢æ°ã®å®å
šãªã³ãŒãã§ãã
function [ mnojitel, ind ] = factorization( delimoe ) % % delitel = 2; % switch delimoe case { 1 } mnojitel( 1, 1 )=1; ind=1; case { -1 } mnojitel( 1, 1 )= -1; ind = 1; otherwise if delimoe < 0 mnojitel( 1, 1 )= -1; ind = 2; delimoe = abs ( delimoe ); else ind = 1; end while ( delimoe ~= delitel ) ostatok = mod( delimoe, delitel ); if ostatok ~= 0 delitel = delitel + 1; else delimoe = delimoe / delitel; mnojitel( 1, ind ) = delitel; ind = ind + 1; end end mnojitel( 1, ind ) = delimoe; end end
ã«ãžã£ã³ãã«èšå·ã®å€ã®èšç®
æ°å€ã2次å°äœã¢ãžã¥ãïŒãã®å Žåã2次æ¯èŒã«ã¯è§£ãããïŒã2次å°äœïŒãã®ãããª2次æ¯èŒã«ã¯è§£ããªãïŒãã©ããã確èªããããã«ããã·ã¢æåŠã§ã¯
LïŒa; pïŒå€åœæåŠã§ã¯
LïŒa / pïŒãšã㊠ã
ã«ãžã£ã³ãã«èšå·ã¯ãæ¬¡ã®æå³ããšãããšãã§ããŸãã
LïŒa; pïŒ= 1 ããã®å Žåaã¯QRã«å±ããäºæ¬¡æ¯èŒã«ã¯è§£ããããŸã
LïŒa; pïŒ= -1 ããã®å Žåaã¯QNRã«å±ãã2次æ¯èŒã«ã¯è§£ããããŸãã
LïŒa; pïŒ= 0ã®å Žåãaãšpã¯äºãã«çŽ ã§ã¯ãããŸãããã€ãŸãã
GCDïŒa; pïŒã¯ 1ãšçãã
ãããŸãã
ãã«ãžã£ã³ãã«èšå·ã®å€ãèšç®ããã«ã¯ã次ã®ããããã£ã䜿çšããŸãã
- LïŒ1; pïŒ= 1
- LïŒ-1; pïŒ=ïŒ-1ïŒ^ïŒïŒp-1ïŒ/ 2ïŒ
- LïŒ2; pïŒ=ïŒ-1ïŒ^ïŒïŒp ^ 2-1ïŒ/ 8ïŒ
- * b *ïŒmod pïŒã®å Žåã LïŒb *; pïŒ= LïŒb; pïŒ* LïŒ; pïŒ
- aâ¡bïŒmod pïŒã®å Žåã LïŒa; pïŒ= LïŒb; pïŒ
- aãšpãçŽ æ°ã®å Žåã LïŒa; pïŒ=ïŒ-1ïŒ^ïŒïŒïŒp-1ïŒ*ïŒa-1ïŒïŒ/ 4ïŒ* LïŒp; aïŒ ã æåŸã®ç¹æ§ã¯ãã¬ãŠã¹çžååãšåŒã°ããŸãã
ã«ãžã£ã³ãã«èšå·ã®èšç®ã¯ãäžèšã®ããããã£ã«åºã¥ããŠããŸãã æ¡ä»¶ã®1ã€ãæºãããããšããã«ãã«ãžã£ã³ãã«èšå·ã®æçµå€ãèŠã€ãããŸã§ãçµæã®ãã¢
aãš
pã®ããããã£ã®ãã§ãã¯ãéå§ããŸãã
次ã«ãã«ãžã£ã³ãã«èšå·ã®å€ã®èšç®ãããã°ã©ã ã§å®è£
ããæ¹æ³ãæ€èšããŸãã
ãã®é¢æ°ã¯ã転éãããæ°åã®ãã¢
aãš
pã®ã«ãžã£ã³ãã«èšå·ã®å€ãè¿ããŸãã ããã¯é¢æ°ããããŒããèŠãããšãã§ããŸãïŒ
function [ sl ] = symvol( a, p )
次ã®ã¹ãããã¯ãæ¬è³ªçã«ããããã£
5ãé©çšããããšã§ãã æ°
aãã¢ãžã¥ãŒã«
pãã倧ããå Žåãã¢ãžã¥ã
pã«å¹æµããããå°ããæ°ã§çœ®ãæããããšãã§ããŸãã
a=mod( a, p );
çµæã®æ°
a ãå æ°åè§£ããããšããŠããŸãã æ°å€ã
å æ°åè§£ããããã«ãæ°å€
aãšãã®æ°å€ãæ§æããåçŽãªå åãå«ããã¯ãã«ãè¿ãã«ã¹ã¿ã
å æ°åè§£é¢æ°ãäœæãããŸããã ãã®æ©èœã«ã€ããŠã¯ãäžã§è©³ãã説æããŸããã
[ mnoj, ind ] = factorization( a );
aãçŽ æ°ã§ãªãå Žå
ãããããã£
4ã«é²ã¿ãŸãã ã€ãŸããæ°å€ã®ãã¢
LïŒa; pïŒã®ã«ãžã£ã³ãã«symbolèšå·ã®å€ã¯ã
aã®åçŽãªå åã§
ããæ°å€ã®ã«ãžã£ã³ãã«symbolsèšå·ã®å€ã®ç©ãšããŠæ±ããããŸãã äžéçµæãä¿åããããã«ãaã®å åã®æ°ã«çããæ¬¡å
ãæã€ãŒãã§æºããããè¡ãã¯ãã«ãäœæããŸãã
aãçŽ æ°ã®å Žå
ããã®è¡ã¯1ã€ã®èŠçŽ ã§æ§æãããŸãã
sl = zeros( 1, ind );
åå åã®ã«ãžã£ã³ãã«èšå·ãèšç®ããã«ã¯ã代ããã«
forã«ãŒãã䜿çš
ããŸããããã«ãããå€ã
1ããæåŸã®å åã®æ°ã«å€æŽãããŸãã ãã®ãµã€ã¯ã«ã®æ¬äœã«ã¯ãäžèšã®ããããã£ã䜿çšããŠã«ãžã£ã³ãã«èšå·ã®å€ãèšç®ããçŽæ¥ããã»ã¹ããããŸãã
ããããã£1ããã§ãã¯ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
ããããã£
2ã«åŸã£ãŠ
LïŒ-1ãpïŒã®åœ¢åŒã§ã·ã³ãã«ã®å€ããã§ãã¯ãããšããå€
ïŒ-1ïŒ^ïŒïŒp-1ïŒ/ 2ïŒãèšç®ããå¿
èŠãããããããã1ã€ã®æ¡ä»¶æŒç®åã䜿çšããå¿
èŠããããŸãããªã³ã®å Žåãã€ã³ãžã±ãŒã¿
-1ã¯å¶æ°ãŸãã¯å¥æ°ã§ãã ããã«å¿ããŠãã«ãžã£ã³ãã«èšå·ã®æå³ã¯ç°ãªããŸãã ææ°ãå¶æ°ã®å Žåãã«ãžã£ã³ãã«èšå·ã¯
1ã«çãããªããããã§ãªãå Žåã¯
-1ã«ãªããŸãã ãã®æ¡ä»¶æŒç®åã䜿çšãããšã
-1ã®
ïŒp-1ïŒ/ 2ã®çޝä¹ãåé¿ãããŸããããã¯éåžžã«é«äŸ¡ãªæäœã§ãã
LïŒ2; pïŒã®åœ¢åŒã§ã«ãžã£ã³ãã«èšå·ã®å€ãèšç®ããå¿
èŠãããå Žåãåæ§ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã ãã®å Žåã
ïŒ-1ïŒ^ïŒïŒp ^ 2-1ïŒ/ 8ïŒã«çãããªããŸãã
ãã®æ¡ä»¶ã確èªããåŸãåçŽãã©ããã確èªããããã«ãæ°å€
aã颿°ã«æž¡ãããŸãã æ°å€
aãè€åã®å ŽåïŒãã®
ind1å åã®æ°ã
1 ãã倧ãã ïŒãååž°ãçºçããæ°å€
aãåã颿°ã«è»¢éãããŠãããã«èšç®ãå®è¡ãããŸãã
[ mn, ind1 ] = factorization( mnoj( 1, i ) );
ãã以å€ã®å Žåãæ°å€
aã¯çŽ æ°ã§ãã åæã«
-1ã1ã2ã«çãããªãå Žåãããããã£
6-ã¬ãŠã¹çžååã䜿çšããå¿
èŠããããŸãã ã«ãžã£ã³ãã«èšå·ã®åã®èšå·ã¯ããã®ææšã®èŠçŽ ã®ããªãã£ã決å®ããããšã«ããæ±ºå®ãããŸãã èŠå ã®å°ãªããšã1ã€ãå¶æ°ã§ããã°ããã©ã¹ã«å€ãããŸãã ãã®åŸã
symvol颿°ã®ååž°åŒã³åºã
ãçºçããåŒæ°ã¯ç°ãªãé åºã§æž¡ãããŸãã
elseif and( mnoj(1,i)~=-1, and( mnoj( 1, i ) ~= 1, mnoj( 1, i ) ~= 2 ) )
äžèšã®æ¡ä»¶ããã§ãã¯ããçµæãaã®å€ã®ãã¹ãŠã®å¯èœãªããªã¢ã³ããã«ããŒãããŸããã
,
sl â
sl , , .
if ind ~= 1 sl = prod( sl );
symvol :
function [ sl ] = symvol( a, p ) % L(a,p) % , % , a=mod( a, p ); % [ mnoj, ind ] = factorization( a ); % sl = zeros( 1, ind ); % % for i = 1:ind % L(1,p) if mnoj( 1, i ) == 1 sl( 1, i ) = 1; end % L(-1,p) if mnoj( 1, i ) == -1 if mod( ( ( p - 1 ) ) / 2, 2 ) == 0 sl( 1, i ) = 1; else sl( 1, i ) = -1; end end % L(2,p) if mnoj( 1, i ) == 2 % 1, -1 if mod( ( ( p^2 - 1 ) / 8 ), 2 ) == 0 sl(1,i)=1; else sl(1,i)=-1; end end [ mn, ind1 ] = factorization( mnoj( 1, i ) ); % , % if ind1 > 1 % - sl( 1, i ) = symvol( mnoj(1,i), p ); % , elseif and( mnoj(1,i)~=-1, and( mnoj( 1, i ) ~= 1, mnoj( 1, i ) ~= 2 ) )% - , 1 2 if or( mod( ( ( p - 1 ) / 2 ), 2 ) == 0, mod( ( ( mnoj( 1, i ) - 1 ) / 2 ), 2 ) == 0 ) % - sl(1,i)= symvol( p, mnoj( 1, i ) ); % L(p,a) else sl(1,i)=-symvol( p, mnoj( 1, i ) ); % -L(p,a) end end end if ind ~= 1 sl = prod( sl ); % L(a,p) end end
, . , . , .
:
- .
- , 1 m=a .
- :
- 3, .
,
kvadrirovanie . , , â .
function [ result ] = kvadrirovanie( a, q, p )
q , ,
size , , .
q = dec2bin( q ); size_q = size(q);
, :
m uint64 .
for ,
i 2 1 ,
q , , .
if size_q( 1, 2 ) >= 2 m = uint64(a); for i=2:1:size_q(1,2)
, ,
i- , ,
m . ,
1 ,
m^2 ,
,
.
if q(1,i)=='1' m = uint64( mod( ( mod( ( m^2 ), p ) * a ), p ));
,
q(1,i)=='0' ,
m^2 .
else m = uint64(mod( ( m^2 ), p )); end
,
m result .
result =uint64(m);
ãã€ããªåœ¢åŒã®ææ°ã¯1ã§ãããææ°ãŸã§äžããå¿
èŠããã£ãå
ã®æ°å€èªäœãçµæå€æ°ã«æžã蟌ãŸããŸãã elseif q(1,1) == '1' result = uint64( a );
ãã®æ¡ä»¶ãæºããããªãå Žåãææ°ã¯0ã§ãããã®å Žåãçµæå€æ°ã«1ãæžã蟌ãŸããŸãã else result = 1; end
äºä¹æ³ã«ããã¹ãä¹ã®å
šæ©èœã³ãŒãïŒ function [ result ] = kvadrirovanie( a, q, p ) % % , 1 % , % . . q = dec2bin( q ); size_q = size(q); if size_q( 1, 2 ) >= 2 m = uint64(a); for i=2:1:size_q(1,2) if q(1,i)=='1' m = uint64( mod( ( mod( ( m^2 ), p ) * a ), p )); else m = uint64(mod( ( m^2 ), p )); end end result =uint64(m); elseif q(1,1) == '1' result = uint64( a); else result = 1; end end
ç·åœ¢æ¯èŒãœãªã¥ãŒã·ã§ã³
, .
k * x â¡ b ( mod p ) . ,
k1 k ,
1 .
lincom k ,
b , ,
p , .
function [ x ] = lincom ( k, b, p)
, . . , , .
( a, b ) , â
b ,
k .
b0 b1 , .
p ,
pr ,
k ,
1 .
b1 while .
b0 .
b0 ,
swap b0 b1 . .
b0=0; b1=1;
, .
b1 b ,
p (
pr ).
x = mod( b1*b, p );
:
function [ x ] = lincom ( k, b, p) % k*x=b ( mod p ) pr=p; b0=0; b1=1; % ostatok = mod( pr, k ); while ostatok~=0 chastnoe = floor( pr / k ); b0 = b0 - b1 * chastnoe; [ b0, b1 ] = swap( b0, b1 ); pr = k; k = ostatok; ostatok = mod( pr, k ); end x = mod( b1*b, p ); end
, :
- .. ( â )
- http://math.hashcode.ru
- http://mathhelpplanet.com
- http://www.wolframalpha.com