2010-12-12 5 views
4

범위는 1-62입니다. 나는 "암호를 해독"하여 원하는 순서대로 생성되도록 추측하고 싶습니다.번호 순서 변경

그래서, 예를 들면,

1-> 35 2-> 3- 19> 61 ... 그래서 1~1 매핑이 있는지

100 몇몇 맵핑되어야 되돌릴 수있는 비율.


내가 매핑을 하드 코딩 할 수 있지만, 내가 그에게 수학 솔루션을 선호하는 것, 인자로 번호를 받아, 범위 1-62의 숫자를 생성하고, 중복을 생성하지 않는 식의 일종. 이 공식이 존재할 가능성이 있습니까? 그냥 역사


, 검증 스크립트 :

<? 
    $test = array(); 

    $val = 37; 
    for($i=0;$i<62;$i++) 
    { 
    if($test[($i*$val)%62]) 
    { 
     print("Collision: $i ".$test[($i*$val)%62]."<br/>"); 
    } 
    $test[($i*$val)%62] = $i; 
    print("$i => ".(($i*$val)%62)."<br/>"); 
    } 

?> 

업데이트 : 이러한 답변에 여기

하는 ID를 생성 감사 :

qpOLHk 
NMb84H 
aI740D 
x5urn0 
UsROKn 
hPeb7K 
EcByu7 
1zYVRu 
oWlieR 
LjIFBe 
8G52YB 
v3splY 
SqPMIl 
fNc95I 
Cazws5 
ZxWTPs 
mUjgcP 
JhGDzc 
6E30Wz 

Sweeeeeet :-)

답변

3

숫자 1 ~ 62를 배열에 넣고 배열을 임의로 섞을 수 있습니다 (예 : Fisher-Yates shuffle 사용). 그런 다음 배열의 색인은 해당 셀의 내용에 매핑됩니다 (그러나 0 색인 배열을 사용하는 경우에는 별개 오류에주의해야합니다).

난수 생성기에 특정 시드를 결정적으로 사용하려면.

편집 : 덜 계산 비용 (추측하는 것도 용이) 맵핑이 어떤 상수를 곱하여 다음 결과를 계산한다 (62)를 모듈로 (modulo) :

result = (input * 37) % 62 

번호 37은 단지 일례이다. coprime에서 62까지의 숫자를 사용할 수 있습니다. 즉, 31에서 떨어진 홀수입니다.

+0

이것은 내가 고려하고있는 하드 코딩을위한 것입니다.정적 시드는 할 것이지만 처리가 너무 많아서 간단합니다. – BarsMonster

+0

@BarsMonster : 처리 할 수있는 양은 얼마입니까? 그리고이 알고리즘의 어느 부분을 너무 비싸 보입니까? –

+0

이것은 해석 된 언어로 초당 10,000 번 수행됩니다. 귀하의 솔루션이 성능면에서 적합하다는 것을 알지만 출력 = (입력 + 35) % 62와 같은 것을 갖고 싶지만 조금 더 무작위 적입니다. – BarsMonster

0

RSA을 사용하십시오. 구현하기 쉽습니다 (언어에 따라 다름). worked example입니다.

+1

불행히도, 출력은 큰 숫자로 구성된 숫자입니다.> 지정된 범위에서 중복없이 각 값을 다른 값으로 매핑하는 방법을 알지 못합니다. – BarsMonster

+0

@BarsMonster : 네 말이 맞아. 1-62의 결과가 필요하다는 것을 알지 못했습니다. – Jacob

1

Mark Byers의 의견에 따라 다릅니다. x mod n의 역 (예 : n = 62)을 찾습니다.

x을 입력 할 간격을 [1, n]으로 지정하십시오. extended Euclidean algorithm을 사용하여 과 같은 및 t을 찾으십시오. 그런 다음 y = x^{-1} mod n.