#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int main( ) {
unsigned int r, q;
std::cout << "Insert r and q for Ham(r,q):\t";
std::cin >> r;
std::cin >> q;
unsigned int s = (unsigned int)( pow(q,r) -1 )/(q-1);
unsigned int **H = new unsigned int*[r];
unsigned int* F_q = new unsigned int[ q ];
for( int i=0; i < q; i++ )
F_q[i] = i;
for(int i = 0; i < r; ++i) {
H[i] = new unsigned int[s];
memset( H[i], 0, s*sizeof( unsigned int ) );
}
int fill_with_ones = 0, current_ones_row = 0, cumulative_row = 0, tick = 0, current = 0;
bool increase;
for( int row = 0; row < r; row++ ) {
increase = true;
current_ones_row = (unsigned int)pow( q, r-1-fill_with_ones );
cumulative_row += current_ones_row;
current = 0;
for( int col = 0; col < s; col++ ) {
tick = (int)pow(q, r-1-row);
if( col >= cumulative_row - current_ones_row && col < cumulative_row ) {
H[ row ][ col ] = 1;
current_ones_row--;
} else { // Entro qui dentro se sono fuori dall'intervallo di uni
if( increase ) {
fill_with_ones++;
increase = false;
}
if( col >= cumulative_row )
break;
else
if( col < cumulative_row - current_ones_row ) { // Entro qui dentro quando sono sotto gli uni, regione da riempire
H[ row ][ col ] = F_q[ current ];
if( (col+1) % tick == 0 ) {
if( (tick == 1 && col == 0) || col != 0 )
current = (current+1) % q;
}
}
}
}
}
std::cout << "\nParity check matrix:\n";
for( int i=0; i < r; i++ ) {
for( int j=0; j < s; j++ )
std::cout << H[i][j] << " ";
std::cout << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oICkgewoJCgl1bnNpZ25lZCBpbnQgciwgcTsKCQoJc3RkOjpjb3V0IDw8ICJJbnNlcnQgciBhbmQgcSBmb3IgSGFtKHIscSk6XHQiOwoJc3RkOjpjaW4gPj4gcjsKCXN0ZDo6Y2luID4+IHE7CgkKCXVuc2lnbmVkIGludCBzID0gKHVuc2lnbmVkIGludCkoIHBvdyhxLHIpIC0xICkvKHEtMSk7CgkKCXVuc2lnbmVkIGludCAqKkggID0gbmV3IHVuc2lnbmVkIGludCpbcl07CgkKCXVuc2lnbmVkIGludCogRl9xID0gbmV3IHVuc2lnbmVkIGludFsgcSBdOwoJCglmb3IoIGludCBpPTA7IGkgPCBxOyBpKysgKQoJCUZfcVtpXSA9IGk7CgkKCWZvcihpbnQgaSA9IDA7IGkgPCByOyArK2kpIHsKCSAgICBIW2ldID0gbmV3IHVuc2lnbmVkIGludFtzXTsKCSAgICBtZW1zZXQoIEhbaV0sIDAsIHMqc2l6ZW9mKCB1bnNpZ25lZCBpbnQgKSApOwoJfQoJCglpbnQgZmlsbF93aXRoX29uZXMgPSAwLCBjdXJyZW50X29uZXNfcm93ID0gMCwgY3VtdWxhdGl2ZV9yb3cgPSAwLCB0aWNrID0gMCwgY3VycmVudCA9IDA7Cglib29sIGluY3JlYXNlOyAKCQkJCQkKCWZvciggaW50IHJvdyA9IDA7IHJvdyA8IHI7IHJvdysrICkgewoJCQoJCWluY3JlYXNlID0gdHJ1ZTsKCQkKCQljdXJyZW50X29uZXNfcm93ID0gKHVuc2lnbmVkIGludClwb3coIHEsIHItMS1maWxsX3dpdGhfb25lcyApOwoJCWN1bXVsYXRpdmVfcm93ICs9IGN1cnJlbnRfb25lc19yb3c7CgkJCgkJY3VycmVudCA9IDA7CgkJCgkJZm9yKCBpbnQgY29sID0gMDsgY29sIDwgczsgY29sKysgKSB7CgkJCQoJCQl0aWNrID0gKGludClwb3cocSwgci0xLXJvdyk7CgkJCQkJCQoJCQlpZiggY29sID49IGN1bXVsYXRpdmVfcm93IC0gY3VycmVudF9vbmVzX3JvdyAmJiBjb2wgPCBjdW11bGF0aXZlX3JvdyApIHsKCQkJCUhbIHJvdyBdWyBjb2wgIF0gPSAxOwoJCQkJY3VycmVudF9vbmVzX3Jvdy0tOwoJCQl9IGVsc2UgeyAJCQkJCQkvLyBFbnRybyBxdWkgZGVudHJvIHNlIHNvbm8gZnVvcmkgZGFsbCdpbnRlcnZhbGxvIGRpIHVuaQoJCQkJaWYoIGluY3JlYXNlICkgewoJCQkJCWZpbGxfd2l0aF9vbmVzKys7CgkJCQkJaW5jcmVhc2UgPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQkJaWYoIGNvbCA+PSBjdW11bGF0aXZlX3JvdyApCgkJCQkJYnJlYWs7CgkJCQllbHNlCgkJCQkJaWYoIGNvbCA8IGN1bXVsYXRpdmVfcm93IC0gY3VycmVudF9vbmVzX3JvdyApIHsJCS8vIEVudHJvIHF1aSBkZW50cm8gcXVhbmRvIHNvbm8gc290dG8gZ2xpIHVuaSwgcmVnaW9uZSBkYSByaWVtcGlyZQoJCQkJCQlIWyByb3cgXVsgY29sIF0gPSBGX3FbIGN1cnJlbnQgXTsKCQkJCQkJCgkJCQkJCWlmKCAoY29sKzEpICUgdGljayA9PSAwICkgewoJCQkJCQkJaWYoICh0aWNrID09IDEgJiYgY29sID09IDApIHx8IGNvbCAhPSAwICkKCQkJCQkJCQljdXJyZW50ID0gKGN1cnJlbnQrMSkgJSBxOwoJCQkJCQl9CgkJCQkJCQkKCQkJCQl9CgkJCX0KCQkJCgkJCQoJCX0KCgl9CgkKCXN0ZDo6Y291dCA8PCAiXG5QYXJpdHkgY2hlY2sgbWF0cml4OlxuIjsKCWZvciggaW50IGk9MDsgaSA8IHI7IGkrKyApIHsKCQlmb3IoIGludCBqPTA7IGogPCBzOyBqKysgKQoJCQlzdGQ6OmNvdXQgPDwgSFtpXVtqXSA8PCAiICI7CgkJCgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsJCQoJfQoJCglyZXR1cm4gMDsKfQ==