Python has a global dictionary called sys.modules which lists all modules that have been loaded. So once you've loaded a module, you can use it for the rest of the lifetime of the interpreter. While IMP.algebra isn't loaded in the script itself, it is loaded by one of the modules that the script loads. I agree it would be clearer if the script loaded the module itself though.
After a few tests I have a better understanding of the mechanism. In fact, there seem to be a special behavior when handling packages : once a packaged module is imported, it is accessible to other modules in that package without further importations. This seems not to be the case when dealing with unpackaged modules.
you are right, I was not reading the good manual :
With your explanations and after a few more tests I finally understand.