#include <iostream>
#include <fstream>
namespace little_endian_io
{
template <typename Word>
std::ostream& write_word(std::ostream& outs, Word value, unsigned size = sizeof(Word))
{
for (; size; --size, value >>= 8)
outs.put(static_cast <char> (value & 0xFF));
return outs;
}
}
using namespace little_endian_io;
void Write_Headers(std::ofstream & plik)
{
// Write the file headers
plik << "RIFF----WAVEfmt ";
write_word(plik, 16, 4);
write_word(plik, 1, 2);
write_word(plik, 2, 2);
write_word(plik, 44100, 4);
write_word(plik, 176400, 4);
write_word(plik, 2, 2);
write_word(plik, 16, 2);
size_t data_chunk_pos = plik.tellp();
plik << "data----";
}
uint64_t collatz(uint64_t & c) {
return (c % 2 == 0) ? c / 2 : (3 * c) + 1;
}
int main()
{
std::ofstream plik;
plik.open("44_16_out.wav", std::ios::binary);
Write_Headers(plik);
for (int l = 1; l < 1860000; l++)
{
uint64_t b = l;
short powtorzenia{ 0 };
while (collatz(b) != 1) {
powtorzenia++;
b = collatz(b);
}
write_word(plik, (short)(20 * powtorzenia), 2);
}
plik.close();
}
Gdy posłucham pliku dźwiękowego wygenerowanego przez ten program to słyszę wyraźnie powtarzającą się sekwencję brzmień, z tym że powtarzającą się coraz wolniej i wolniej. Jeśli ktoś ma dobre ucho i dobre słuchawki to usłyszy to od razu. Gdy to pierwszy raz posłuchałem to skojarzyło mi się to z fraktalem a potem ze spiralą. Czyżby funkcja Collatza miała jakąś prawidłowość? Plik dźwiękowy jest stereo, ale dla mono jest podobnie. Jeśli ktoś ma cierpliwość, to niech zanalizuje program i posłucha wyniku.