Compare commits

...

5 Commits

  1. 1
      code/python/assets/commands.yaml
  2. 2
      code/python/dist/VERSION
  3. 10
      code/python/docs/commands/Models/CommandEuklid.md
  4. 11
      code/python/docs/commands/Models/CommandPollard.md
  5. 1
      code/python/docs/commands/Models/CommandRucksack.md
  6. 2
      code/python/docs/commands/README.md
  7. 2
      code/python/docs/config/Models/AppOptions.md
  8. 6
      code/python/models/commands-schema.yaml
  9. 2
      code/python/models/config-schema.yaml
  10. 2
      code/python/pyproject.toml
  11. 1
      code/python/src/algorithms/euklid/algorithms.py
  12. 48
      code/python/src/algorithms/pollard_rho/algorithms.py
  13. 42
      code/python/src/algorithms/pollard_rho/display.py
  14. 1
      code/python/src/endpoints/ep_algorithm_pollard_rho.py
  15. 16
      code/python/src/models/pollard_rho/__init__.py
  16. 26
      code/python/src/models/pollard_rho/logging.py

1
code/python/assets/commands.yaml

@ -126,3 +126,4 @@
- 58
- name: POLLARD-RHO
number: 534767
x-init: 5

2
code/python/dist/VERSION vendored

@ -1 +1 @@
0.2.0
0.3.0

10
code/python/docs/commands/Models/CommandEuklid.md

@ -0,0 +1,10 @@
# CommandEuklid
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**name** | [**EnumAlgorithmNames**](EnumAlgorithmNames.md) | | [default to null]
**numbers** | [**List**](integer.md) | | [default to null]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

11
code/python/docs/commands/Models/CommandPollard.md

@ -0,0 +1,11 @@
# CommandPollard
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**name** | [**EnumAlgorithmNames**](EnumAlgorithmNames.md) | | [default to null]
**number** | [**Integer**](integer.md) | | [default to null]
**xMinusinit** | [**Integer**](integer.md) | | [optional] [default to 2]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

1
code/python/docs/commands/Models/CommandRucksack.md

@ -3,6 +3,7 @@
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**name** | [**EnumAlgorithmNames**](EnumAlgorithmNames.md) | | [default to null]
**algorithm** | [**EnumRucksackAlgorithm**](EnumRucksackAlgorithm.md) | | [default to null]
**allowMinusfractional** | [**Boolean**](boolean.md) | | [optional] [default to false]
**maxMinuscost** | [**BigDecimal**](number.md) | Upper bound for total cost of rucksack. | [default to null]

2
code/python/docs/commands/README.md

@ -13,7 +13,9 @@ Class | Method | HTTP request | Description
## Documentation for Models
- [Command](.//Models/Command.md)
- [CommandEuklid](.//Models/CommandEuklid.md)
- [CommandHirschberg](.//Models/CommandHirschberg.md)
- [CommandPollard](.//Models/CommandPollard.md)
- [CommandRucksack](.//Models/CommandRucksack.md)
- [CommandTarjan](.//Models/CommandTarjan.md)
- [CommandTsp](.//Models/CommandTsp.md)

2
code/python/docs/config/Models/AppOptions.md

@ -9,6 +9,8 @@ Name | Type | Description | Notes
**tsp** | [**AppOptions_tarjan**](AppOptions_tarjan.md) | | [default to null]
**hirschberg** | [**AppOptions_hirschberg**](AppOptions_hirschberg.md) | | [default to null]
**rucksack** | [**AppOptions_rucksack**](AppOptions_rucksack.md) | | [default to null]
**euklid** | [**AppOptions_tarjan**](AppOptions_tarjan.md) | | [default to null]
**pollardMinusrho** | [**AppOptions_tarjan**](AppOptions_tarjan.md) | | [default to null]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

6
code/python/models/commands-schema.yaml

@ -1,6 +1,6 @@
openapi: 3.0.3
info:
version: 0.2.0
version: 0.3.0
title: Schemata for command instructions
servers:
- url: "."
@ -185,6 +185,10 @@ components:
number:
type: integer
exclusiveMinimum: 0
x-init:
type: integer
default: 2
minimum: 2
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Enum Algorithm Names
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2
code/python/models/config-schema.yaml

@ -1,6 +1,6 @@
openapi: 3.0.3
info:
version: 0.2.0
version: 0.3.0
title: Schemata for config models
servers:
- url: "."

2
code/python/pyproject.toml

@ -1,6 +1,6 @@
[project]
name = "uni-leipzig-ads-2-2022"
version = "0.2.0"
version = "0.3.0"
description = "Zusatzcode, um Algorithmen und Datenstrukturen im Kurs ADS2 zu demonstrieren."
authors = [ "Raj Dahya" ]
maintainers = [ "raj_mathe" ]

1
code/python/src/algorithms/euklid/algorithms.py

@ -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('');
return d, coeff_a, coeff_b;

48
code/python/src/algorithms/pollard_rho/algorithms.py

@ -10,8 +10,8 @@ from src.thirdparty.maths import *;
from models.generated.config import *;
from src.core.utils import *;
# from src.models.pollard_rho import *;
from src.algorithms.euklid.display import *;
from src.models.pollard_rho import *;
from src.algorithms.pollard_rho.display import *;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# EXPORTS
@ -27,6 +27,48 @@ __all__ = [
def pollard_rho_algorithm(
n: int,
x_init: int = 2,
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;

42
code/python/src/algorithms/pollard_rho/display.py

@ -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;

1
code/python/src/endpoints/ep_algorithm_pollard_rho.py

@ -28,6 +28,7 @@ __all__ = [
def endpoint_pollard_rho(command: CommandPollard) -> Result[CallResult, CallError]:
result = pollard_rho_algorithm(
n = command.number,
x_init = command.x_init,
verbose = config.OPTIONS.tsp.verbose,
);
return Ok(CallResult(action_taken=True, message=result));

16
code/python/src/models/pollard_rho/__init__.py

@ -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

@ -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…
Cancel
Save