Dec 18 2011

Compiling LyX on Mac

When you learn mathematics at the university, and you are a bit of computer’s freak, you will probably want to take lecture notes on the computer.

You are all probably familiar with $latex \LaTeX$ (if not, well… It’s the standard way to write type equations). The best editor for LaTeX is LyX (Well, maybe best is a strong word, The less of all evil is much better).

Recently I’ve bought a new MacBook Air (Mac OS X Lion version 10.7.2. i7 processor), And I’m using it in the university to take some lecture notes. Unfortunately, the LyX release version for mac is a little bit buggy… (for example, when you try to open a file when another file is open it fails most of the time, and if you insist LyX will probably crash. Some characters, such as $latex \Omega$, are not being displayed on editor mode). So I’ve decided to download the source code from their SVN and compile the latest development version.

To make a long story short, I’ve encountered a lot of errors, And I’ve decided to list them here so if you will get them you will be able to solve them much quicker than me.

First error – ICONV_CONST not defined

The first error I’ve encountered was the following:

docstream.cpp: In member function ‘std::codecvt_base::result<unnamed>::iconv_codecvt_facet::do_iconv(void*, const char**, size_t*, char**, size_t*) const’:
docstream.cpp:264: error: expected `>' before ‘ICONV_CONST’
docstream.cpp:264: error: expected `(' before ‘ICONV_CONST’
docstream.cpp:264: error: ‘ICONV_CONST’ was not declared in this scope
docstream.cpp:264: error: expected primary-expression before ‘>’ token

Here the solution is simple. The problem is that the configure doesn’t config the ICONV_CONST properly. The solution to edit the config.h file located in the lyx-devel directory, and add the following line:

#define ICONV_CONST

And now it will work wonderfully.

Second error – Undefined symbols for arh

The second error was much more annoying, and I’ve even destroyed my Mac by mistake while trying to solve it (Had to reinstall it). The solution is a bit more difficult, but no worries.

The error I got, was the following linking error:

Undefined symbols for architecture x86_64:
  "_libiconv_open", referenced from:
      lyx::IconvProcessor::init()     in liblyxsupport.a(unicode.o)
      (anonymous namespace)::iconv_codecvt_facet::iconv_codecvt_facet(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_Ios_Openmode, unsigned long)in liblyxsupport.a(docstream.o)
  "_libiconv", referenced from:
      lyx::IconvProcessor::convert(char const*, unsigned long, char*, unsigned long)in liblyxsupport.a(unicode.o)
      (anonymous namespace)::iconv_codecvt_facet::do_out(__mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) constin liblyxsupport.a(docstream.o)
      (anonymous namespace)::iconv_codecvt_facet::do_in(__mbstate_t&, char const*, char const*, char const*&, wchar_t*, wchar_t*, wchar_t*&) constin liblyxsupport.a(docstream.o)
  "_libiconv_close", referenced from:
      lyx::IconvProcessor::convert(char const*, unsigned long, char*, unsigned long)in liblyxsupport.a(unicode.o)
      lyx::IconvProcessor::Impl::~Impl()in liblyxsupport.a(unicode.o)
      (anonymous namespace)::iconv_codecvt_facet::~iconv_codecvt_facet()in liblyxsupport.a(docstream.o)
      (anonymous namespace)::iconv_codecvt_facet::~iconv_codecvt_facet()in liblyxsupport.a(docstream.o)
ld: symbol(s) not found for architecture x86_64

There seems to be a problem with the built-in libiconv library that comes with the OS. The solution was to get the latest source code from GNU, and installing it.

The way to install it is as follows:

Download the archive file, open a terminal in the folder with the archive and type the following commands:

tar -xzvf libiconv-1.14.tar.gz
cd libiconv-1.14

./configure '--prefix=/usr/local' 'CC=gcc -arch i386 -arch x86_64' 'CXX=g++ -arch i386 -arch x86_64' 'CPP=gcc -E' 'CXXCPP=g++ -E'

make
sudo make install

Note: It is very important NOT to install the lib to “/usr/lib“. but to “/usr/local/lib” (That’s they way I’ve messed up my all OS, and it wouldn’t boot afterwards).

After installing the libiconv, you will need to configure and install LyX  using the following commands (assuming you are in the lyx-devel directory):

LDFLAGS="-L/usr/local/lib" ./configure --with-version-suffix=-2.0 --with-libiconv-prefix=/usr/local --with-x=no --disable-stdlib-debug

make
make install

Note: You will probably encounter again the first error I had, because running the configure recreate the config.h file. Just reedit the config.h file as mentioned in the last section.

And that’s it!

It seems like in the current development version the opening bug is fixed, but the missing symbols are still missing. Hopefully it will be fixed soon (I’m looking into it).


Nov 7 2011

Birthday Paradox

The Birthday Paradox is not real paradox, you will not find any logical contradiction in the next few paragraphs. It is called a paradox because it is very counter-intuitive, and you will soon find out why.

The paradox is demonstrated in the following way: Choose $latex n$ people randomly. What is the probability that two of them were born on the same date? (only day and month, discarding the year. and assuming there are 365 days every year)

Lets say that $latex n=40$, what do you think that chances are?
Most people will think the probability is very low, but is it?

First lets define our sample space:

$latex \Omega=\left\{ \left(d_{1},\ldots,d_{n}\right)\, d_{i}\in\left\{ 1,\ldots,365\right\} \right\}$

The vector $latex \left(d_{1},\ldots,d_{n}\right)$ defines a series of dates for every person. Meaning $latex d_1$ is the birthday of the first person, $latex d_2$ of the second and so on…

The event we are interested in is the following:

$latex A=\left\{ d_{i}=d_{j},\text{ for any } i\neq j \right\}$

Apparently, Doing the direct calculation to solve this problem is hard, too hard. So we’ll attack the problem from a different angle.

Lets take a look at the complement of A (meaning, that every person in the group was born on a unique date):

$latex A^{c}=\left\{ \left(d_{1},\ldots,d_{n}\right)\in\Omega:\, d_{i}\neq d_{j},\,\forall i\neq j\right\}$

It is easily calculated that the number of elements in $latex A^{c}$ is:

$latex \left|A^{c}\right|=365\cdot364\cdot\ldots\cdot\left(365-n+1\right)$

And of course the number of elements in our sample space (meaning the number of options for birthdays for $latex n$ people) is:

$latex \left|\Omega\right|=365^{n}$

Assuming uniform probability, the probability that every person was born on a unique date is:

$latex P\left(A^{c}\right)=\frac{\left|A^{c}\right|}{\left|\Omega\right|}=\frac{365}{365}\cdot\frac{364}{365}\cdot\ldots\cdot\frac{365-n+1}{365}=\prod_{k=0}^{n-1}\left(1-\frac{k}{365}\right)$

Therefore, the probability that at least two people were born on the same day is:

$latex P\left(A\right)=1-P\left(A^{c}\right)=1-\prod_{k=0}^{n-1}\left(1-\frac{k}{365}\right)$

So, said $latex n=40$ right? lets calculate! (Don’t worry, you can let WolframAlpha do the calculations for you)

$latex P\left(A_{40}\right)=1-\prod_{k=0}^{39}\left(1-\frac{k}{365}\right)\approx 0.891232$

So it seems the probability is more than 89%! Amazing, isn’t it?

If you want, you can checkout and find that after 23 people, the probability pass the 50% barrier, and that after only 57 people the probability is more than 99%!