Usporiadanie podľa uhlov (vzhľadom k [0,0]) len celočíselne

In [11]:
body = [[0,1],[1,0],[1,2], [2,1],[0,-1],[-1,0],[-1,-2], [-2,-1]]
In [25]:
from functools import cmp_to_key

def comp(b1, b2):
    #usporiadame podľa polroviny, v ktorej ležia, a v rámci nej podľa znamienka vektorového súčinu.
    if b1[0] < 0 < b2[0]:
        return -1
    if b1[0] > 0 > b2[0]:
        return 1
    x = b1[0]*b2[1]-b1[1]*b2[0] #z-ova zlozka vektorveho sucinu (cross product, b1 x b2)
    if x > 0:
        return 1
    elif x < 0:
        return -1
    return 0

sorted(body, key=cmp_to_key(comp))
Out[25]:
[[-1, -48],
 [-4, -60],
 [-9, -70],
 [-23, -89],
 [-22, -83],
 [-22, -77],
 [-15, -26],
 [-69, -81],
 [-54, -55],
 [-53, -49],
 [-33, -12],
 [-80, -26],
 [-99, 14],
 [-70, 13],
 [-92, 69],
 [-79, 86],
 [34, 100],
 [27, 34],
 [65, 66],
 [80, 68],
 [92, 62],
 [71, 31],
 [99, 21],
 [41, -10],
 [51, -33],
 [40, -31],
 [24, -44],
 [13, -27],
 [36, -75],
 [2, -64]]
In [16]:
from math import atan2
atan2(7,3)
Out[16]:
1.1659045405098132
In [17]:
p = sorted(body, key=cmp_to_key(comp))
for b in p:
    print(atan2(b[0], b[1]))
-2.677945044588987
-2.0344439357957027
-1.5707963267948966
0.0
0.4636476090008061
1.1071487177940904
1.5707963267948966
3.141592653589793
In [19]:
from random import randint
randint(1, 15)
Out[19]:
8
In [29]:
body=[[randint(-100,100), randint(-100,100)] for _ in range(30)]
p = sorted(body, key=cmp_to_key(comp))
for b in p:
    print(atan2(b[0], b[1]))
-2.522431306459331
-2.465582676514485
-2.356194490192345
-2.2531128816696446
-2.214297435588181
-2.0032041023654346
-1.784857010358718
-1.7524451567949086
-1.7147217761831128
-1.6010900867136717
-1.0276067505070687
-0.953040601228664
-0.9445348891961419
-0.49811671000031416
-0.15394466445834992
-0.12308595969500578
-0.013887995930967074
0.10191836748087388
0.15160548743827282
0.1920480172407301
0.5525843502907141
0.7906337176538559
0.8304127791719753
1.0863183977578734
1.1722738811284763
1.5951817359676153
2.2209308374629195
2.496373333428955
2.6189418807949543
3.0348569809406576
In [33]:
for i in [10, 100, 1000]:
    print(2.**i)
    print(1.4656**i)
    print(3**(i/3))
    print()
1024.0
45.72508939705128
38.940738398300034

1.2676506002282294e+30
3.9952653832805496e+16
8017552713427582.0

1.0715086071862673e+301
1.0362303873407359e+166
1.0975346493712745e+159

In [39]:
n = 24
n**2*2**n < 10**10
Out[39]:
True

Maxima: solve([x^4-x^3-1=0],x); ... 1.380277569097595