Seite 1 von 1

Wir spielen: name that function.

Verfasst: Dienstag 6. April 2010, 13:11
von akis.kapo
Wie heisst diese Funktion?

Code: Alles auswählen

#!/usr/bin/env python

def comprfunc(i, b=None):
    c = 0
    j = i
    if b is None:
        b = 8
    lim = 2**b
    for x in xrange(b):
        c  =  (c+i) % lim
        i  = (i<<1) % lim
        c ^=  (j+i) % lim
    return c
Ich habe sie frei erfunden.

Allerdings glaube ich, ich war nicht der erste.

UPDATE:

Ach ja, nochwas:

Code: Alles auswählen

Python 2.5.2 (r252:60911, Dec  2 2008, 09:26:14)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from pycf import *
>>> [comprfunc(i,8) for i in xrange(256)]
[0, 85, 170, 171, 84, 49, 86, 95, 168, 237, 98, 19, 172, 185, 190, 183,
80, 197, 218, 251, 196, 65, 38, 47, 88, 61, 114, 3, 124, 105, 110, 103,
160, 181, 138, 75, 180, 81, 246, 63, 136, 77, 130, 179, 76, 153, 94, 151,
176, 229, 122, 91, 228, 161, 6, 79, 248, 221, 210, 227, 220, 9, 206, 7, 64,
21, 106, 235, 20, 113, 150, 31, 104, 45, 162, 83, 236, 249, 126, 119, 16,
5, 154, 187, 4, 1, 102, 111, 152, 253, 50, 67, 188, 169, 46, 39, 96, 245,
202, 11, 244, 17, 182, 127, 200, 13, 66, 115, 12, 89, 158, 215, 240, 165,
186, 155, 164, 225, 198, 15, 184, 29, 18, 163, 156, 201, 14, 71, 128, 213,
42, 43, 212, 177, 214, 223, 40, 109, 226, 147, 44, 57, 62, 55, 208, 69, 90,
123, 68, 193, 166, 175, 216, 189, 242, 131, 252, 233, 238, 231, 32, 53, 10,
203, 52, 209, 118, 191, 8, 205, 2, 51, 204, 25, 222, 23, 48, 101, 250, 219,
100, 33, 134, 207, 120, 93, 82, 99, 92, 137, 78, 135, 192, 149, 234, 107,
148, 241, 22, 159, 232, 173, 34, 211, 108, 121, 254, 247, 144, 133, 26, 59,
132, 129, 230, 239, 24, 125, 178, 195, 60, 41, 174, 167, 224, 117, 74, 139,
116, 145, 54, 255, 72, 141, 194, 243, 140, 217, 30, 87, 112, 37, 58, 27,
36, 97, 70, 143, 56, 157, 146, 35, 28, 73, 142, 199]
>>>
Vielleicht hilft das ja...

Verfasst: Dienstag 6. April 2010, 13:19
von derdon
Ich rate mal ins Blaue und sage "comprfunc"...

Edit: Und wie heißt diese Funktion?

Code: Alles auswählen

foo=lambda:None;foo.__name__*=2

Verfasst: Dienstag 6. April 2010, 13:26
von akis.kapo
Das muss doch irgendeine bekannte Hash- oder PRNG-Funktion sein.
Kann doch kein Zufall sein, dass sie sowohl "pseudo-zufällig" scheint, als auch bijektiv ist und zudem relativ trivial aufgebaut ist.

Verfasst: Dienstag 6. April 2010, 13:30
von INFACT
was bringt denn eigentlich der << operator?

Verfasst: Dienstag 6. April 2010, 13:33
von akis.kapo
INFACT hat geschrieben:was bringt denn eigentlich der << operator?
Linksverschiebung um eine Stelle (ein Bit). Kommt einer Verdoppelung / Multiplikation mal 2 gleich.
Allerdings nehme ich das dann anschliessend modulo lim und "cappe/truncate" des Wert somit.