woche12 > master: code py - pollards rho implementiert
This commit is contained in:
parent
f6401f0dfc
commit
15fe1b04d4
@ -94,5 +94,4 @@ def euklidean_algorithm(
|
|||||||
print(f'a=\x1b[1m{step.a}\x1b[0m; b=\x1b[1m{step.b}\x1b[0m; d = \x1b[1m{step.gcd}\x1b[0m = {expr}.');
|
print(f'a=\x1b[1m{step.a}\x1b[0m; b=\x1b[1m{step.b}\x1b[0m; d = \x1b[1m{step.gcd}\x1b[0m = {expr}.');
|
||||||
print('');
|
print('');
|
||||||
|
|
||||||
|
|
||||||
return d, coeff_a, coeff_b;
|
return d, coeff_a, coeff_b;
|
||||||
|
@ -10,8 +10,8 @@ from src.thirdparty.maths import *;
|
|||||||
|
|
||||||
from models.generated.config import *;
|
from models.generated.config import *;
|
||||||
from src.core.utils import *;
|
from src.core.utils import *;
|
||||||
# from src.models.pollard_rho import *;
|
from src.models.pollard_rho import *;
|
||||||
from src.algorithms.euklid.display import *;
|
from src.algorithms.pollard_rho.display import *;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# EXPORTS
|
# EXPORTS
|
||||||
@ -27,6 +27,48 @@ __all__ = [
|
|||||||
|
|
||||||
def pollard_rho_algorithm(
|
def pollard_rho_algorithm(
|
||||||
n: int,
|
n: int,
|
||||||
|
x_init: int = 2,
|
||||||
verbose: bool = False,
|
verbose: bool = False,
|
||||||
):
|
):
|
||||||
return;
|
d = 1;
|
||||||
|
x = y = x_init;
|
||||||
|
steps = [];
|
||||||
|
steps.append(Step(x=x, y=y));
|
||||||
|
success = False;
|
||||||
|
f = lambda _: fct(_, n=n);
|
||||||
|
while True:
|
||||||
|
x = f(x);
|
||||||
|
y = f(f(y));
|
||||||
|
d = math.gcd(abs(x-y), n);
|
||||||
|
steps.append(Step(x=x, y=y, d=d));
|
||||||
|
if d == 1:
|
||||||
|
continue;
|
||||||
|
elif d < n:
|
||||||
|
success = True;
|
||||||
|
break;
|
||||||
|
else:
|
||||||
|
success = False;
|
||||||
|
break;
|
||||||
|
|
||||||
|
if verbose:
|
||||||
|
repr = display_table(steps=steps);
|
||||||
|
print('');
|
||||||
|
print('\x1b[1mEuklidescher Algorithmus\x1b[0m');
|
||||||
|
print('');
|
||||||
|
print(repr);
|
||||||
|
print('');
|
||||||
|
if success:
|
||||||
|
print('\x1b[1mBerechneter Faktor:\x1b[0m');
|
||||||
|
print('');
|
||||||
|
print(f'd = \x1b[1m{d}\x1b[0m.');
|
||||||
|
else:
|
||||||
|
print('\x1b[91mKein (Prim)faktor erkannt!\x1b[0m');
|
||||||
|
print('');
|
||||||
|
return d;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# AUXILIARY METHOD function for Pollard's rho
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def fct(x: int, n: int) -> int:
|
||||||
|
return (x**2 - 1) % n;
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.thirdparty.code import *;
|
||||||
|
from src.thirdparty.maths import *;
|
||||||
|
from src.thirdparty.types import *;
|
||||||
|
|
||||||
|
from src.models.pollard_rho import *;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# EXPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'display_table',
|
||||||
|
];
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# METHOD display table
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
def display_table(steps: List[Step]) -> str:
|
||||||
|
table = pd.DataFrame({
|
||||||
|
'i': [i for i in range(len(steps))],
|
||||||
|
'x': [step.x for step in steps],
|
||||||
|
'y': [step.y for step in steps],
|
||||||
|
'd': [step.d or '-' for step in steps],
|
||||||
|
}) \
|
||||||
|
.reset_index(drop=True);
|
||||||
|
# benutze pandas-Dataframe + tabulate, um schöner darzustellen:
|
||||||
|
repr = tabulate(
|
||||||
|
table,
|
||||||
|
headers=['i', 'x[i]', 'y[i] = x[2i]', 'gcd(|x - y|,n)'],
|
||||||
|
showindex=False,
|
||||||
|
colalign=('right', 'right', 'right', 'center'),
|
||||||
|
tablefmt='simple',
|
||||||
|
);
|
||||||
|
return repr;
|
@ -28,6 +28,7 @@ __all__ = [
|
|||||||
def endpoint_pollard_rho(command: CommandPollard) -> Result[CallResult, CallError]:
|
def endpoint_pollard_rho(command: CommandPollard) -> Result[CallResult, CallError]:
|
||||||
result = pollard_rho_algorithm(
|
result = pollard_rho_algorithm(
|
||||||
n = command.number,
|
n = command.number,
|
||||||
|
x_init = command.x_init,
|
||||||
verbose = config.OPTIONS.tsp.verbose,
|
verbose = config.OPTIONS.tsp.verbose,
|
||||||
);
|
);
|
||||||
return Ok(CallResult(action_taken=True, message=result));
|
return Ok(CallResult(action_taken=True, message=result));
|
||||||
|
16
code/python/src/models/pollard_rho/__init__.py
Normal file
16
code/python/src/models/pollard_rho/__init__.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.models.pollard_rho.logging import *;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# EXPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'Step',
|
||||||
|
];
|
26
code/python/src/models/pollard_rho/logging.py
Normal file
26
code/python/src/models/pollard_rho/logging.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from src.thirdparty.types import *;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# EXPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'Step',
|
||||||
|
];
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# CLASS Step
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Step():
|
||||||
|
x: int = field();
|
||||||
|
y: int = field();
|
||||||
|
d: Optional[int] = field(default=None);
|
Loading…
x
Reference in New Issue
Block a user