**Faktoradik** adalah sebuah sistem bilangan yang setiap posisi angka memiliki basis sesuai dengan faktorial dari posisinya. Sistem bilangan ini memungkinkan untuk membangkitkan permutasi dalam urutan leksikografik.

Faktoradik memiliki bentuk deretan bilangan
*a*n...*a*4*a*3*a*2*a*1*a*0, dengan setiap bilangan *a*i bersifat:

{\displaystyle a\_{i}\in \mathbb {N} }
dan

{\displaystyle 0\leq a\_{i}\leq i}

Nilai faktoradik
----------------

Nilai sebuah faktoradik *a*n...*a*4*a*3*a*2*a*1*a*0 dapat dengan mudah didapat menggunakan formula:

{\displaystyle \sum \_{i=0}^{n}a\_{i}.i!}
Sebagai contoh, bilangan 2,1,1,1,0

Posisi setiap bilangan, sama seperti pada sistem bilangan posisional lainnya, dinomori mulai dari 0 dari sebelah kanan.

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| Bilangan ke | 5 | 4 | 3 | 2 | 1 | 0 |
| Bilangan | 0 | 2 | 1 | 1 | 1 | 0 |
| Faktorial | 120 | 24 | 6 | 2 | 1 | 1 |

Sehingga nilainya adalah sebesar:
2×4! + 1×3! + 1×2! + 1×1! + 0×0! = 57

Di bawah ini adalah daftar 24 faktoradik pertama beserta nilainya:

| Faktoradik | Nilai | Faktoradik | Nilai | Faktoradik | Nilai | Faktoradik | Nilai |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 0, 0, 0, 0 | 0 | 1, 0, 0, 0 | 6 | 2, 0, 0, 0 | 12 | 3, 0, 0, 0 | 18 |
| 0, 0, 1, 0 | 1 | 1, 0, 1, 0 | 7 | 2, 0, 1, 0 | 13 | 3, 0, 1, 0 | 19 |
| 0, 1, 0, 0 | 2 | 1, 1, 0, 0 | 8 | 2, 1, 0, 0 | 14 | 3, 1, 0, 0 | 20 |
| 0, 1, 1, 0 | 3 | 1, 1, 1, 0 | 9 | 2, 1, 1, 0 | 15 | 3, 1, 1, 0 | 21 |
| 0, 2, 0, 0 | 4 | 1, 2, 0, 0 | 10 | 2, 2, 0, 0 | 16 | 3, 2, 0, 0 | 22 |
| 0, 2, 1, 0 | 5 | 1, 2, 1, 0 | 11 | 2, 2, 1, 0 | 17 | 3, 2, 1, 0 | 23 |

Mendapatkan Faktoradik dari Sembarang Bilangan
----------------------------------------------

Suatu faktoradik bisa diperoleh dari sembarang bilangan {\displaystyle n} dengan algoritme sebagai berikut:

1. Cari {\displaystyle i!} terbesar di mana {\displaystyle i!<n}
2. Bagi {\displaystyle n} dengan {\displaystyle i!}, akan didapatkan hasil bagi {\displaystyle d} dan sisa bagi {\displaystyle m}.
3. {\displaystyle d} adalah digit faktoradik ke-{\displaystyle i}, yaitu {\displaystyle a\_{i}}
4. Ulangi dari langkah kedua, dengan {\displaystyle m}(sisa bagi) menggantikan {\displaystyle n}, dan {\displaystyle i-1} menggantikan {\displaystyle i}.
5. Algoritme selesai jika {\displaystyle i} sudah mencapai 0.

Ketika berakhir, algoritme ini akan menghasilkan deretan faktoradik *a*n...*a*4*a*3*a*2*a*1*a*0.

Permutasi
---------

### Membentuk Permutasi berdasarkan Faktoradik

Pertama-tama kita harus membuat kesepakatan mengenai indeks. Indeks untuk untai dimulai dengan indeks 0 dari kiri.

|  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Untai | a | b | c | d | e | f | g |
| Indeks | 0 | 1 | 2 | 3 | 4 | 5 | 6 |

Disediakan sebuah untai {\displaystyle s}, dan sebuah faktoradik {\displaystyle f}, maka algoritme untuk menghasilkan sebuah permutasi dari {\displaystyle s} adalah:

1. Sediakan satu tempat, yaitu {\displaystyle s'} untuk menampung untai hasil permutasi
2. Mulai dari digit {\displaystyle f} paling kiri (digit dengan indeks posisi paling besar):
	* Ambil huruf dari {\displaystyle s} di posisi {\displaystyle f\_{i}}, pindahkan ke {\displaystyle s'}
3. Ulangi hingga tidak ada lagi huruf pada untai {\displaystyle s}

Ketika algoritme ini selesai, {\displaystyle s'} akan merupakan permutasi dari {\displaystyle s} yang sesuai dengan {\displaystyle f}

Sebagai contoh, untuk menghasilkan permutasi dari **abcdefg**, dengan indeks faktoradik 5341200 dengan algoritme tersebut, diberikan:

{\displaystyle s=\mathbf {abcdefg} }
dan

{\displaystyle f=(5,3,4,1,2,0,0)}
Disediakan {\displaystyle s'=\epsilon } (masih kosong).

|  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Untai | a | b | c | d | e | f | g |
| Indeks | 0 | 1 | 2 | 3 | 4 | 5 | 6 |

Pertama, mulai dari {\displaystyle f\_{6}}, yaitu 5. Kemudian pindahkan huruf ke-5 (indeks 5) pada untai {\displaystyle s} ke untai {\displaystyle s'}, yaitu huruf **f**. Kondisi {\displaystyle s} dan {\displaystyle s'} sekarang menjadi {\displaystyle s=\mathbf {abcdeg} } dan {\displaystyle s'=\mathbf {f} }

Dengan {\displaystyle s} sekarang menjadi:

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| Untai | a | b | c | d | e | g |
| Indeks | 0 | 1 | 2 | 3 | 4 | 5 |

Bilangan kedua dari {\displaystyle f}, yaitu {\displaystyle f\_{5}} adalah 3, maka pindahkan huruf ke-3 pada untai {\displaystyle s} ke untai {\displaystyle s'}. Maka kondisinya menjadi {\displaystyle s=\mathbf {abceg} } dan {\displaystyle s'=\mathbf {fd} }

|  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- |
| Untai | a | b | c | e | g |
| Indeks | 0 | 1 | 2 | 4 | 6 |

Dan seterusnya, yang jika dituliskan sekaligus adalah seperti ini:

| i | {\displaystyle f\_{i}} | {\displaystyle s} | {\displaystyle s'} |
| --- | --- | --- | --- |
| 6 | 5 | abcdeg | f |
| 5 | 3 | abceg | fd |
| 4 | 4 | abce | fdg |
| 3 | 1 | ace | fdgb |
| 2 | 2 | ac | fdgbe |
| 1 | 0 | c | fdgbea |
| 0 | 0 |  | fdgbeac |

Kode-kode program
-----------------

### Kode program untuk membangkitkan faktoradik

#### Pascal

```
 FMax:= CariFaktorialTerbesar(Bilangan);
 Sisa:= Bilangan;
 **for** i:= FMax **downto** 0 **do**
 **begin**
   f:= Faktorial(i);
   A[i]:= Sisa **div** f;
   Sisa:= Sisa **mod** f;
 **end**;
```

### Kode untuk membangkitkan permutasi dari faktoradik

#### Pascal

```
 **function** Permutasi(Untai: STRING; Faktoradik: **array of** INTEGER): STRING;
 **var**
   Hasil: STRING;
   i, Indeks: INTEGER;
 **begin**
   Hasil:=*;*
 
   **for** i:=Low(Faktoradik) **to** High(Faktoradik) **do**
   **begin**
     Indeks:=Faktoradik[i] + 1;       // *Indeks ditambah 1 karena indeks array berawal dari 0*
     Hasil:=Hasil + Untai[ Indeks ];
     Delete(Untai, Indeks, 1);
   **end**;
 
   Permutasi:=Hasil;
 **end**;
```

Lihat pula
----------

* Kombinadik
* Permutasi
* Bilangan Inversi
* Sistem bilangan

Pranala luar
------------

Using Permutations in .NET for Improved Systems Security Diarsipkan 2008-04-12 di Wayback Machine.